Python datetime.strptime () Essen viel CPU-Zeit

7

Ich habe einen Log-Parsing-Code, der einen Timestamp in ein Datetime-Objekt umwandeln muss. Ich benutze datetime.strptime, aber diese Funktion verwendet eine Menge cputime entsprechend cProfiles cumtime Spalte. Die Zeitstempel haben das Format 01/Nov/2010:07:49:33 .

Die aktuelle Funktion ist:

%Vor%

Weiß jemand, wie ich das optimieren könnte?

    
Kyle Brandt 01.11.2010, 16:28
quelle

4 Antworten

13

Wenn es sich um Formate mit fester Breite handelt, muss die Zeile nicht analysiert werden. Sie können Slicing und eine Dictionary-Suche verwenden, um die Felder direkt abzurufen.

%Vor%

Testing in der Art und Weise, die von Glenn Maynard zeigt dies etwa 3 mal schneller an.

    
Mark Ransom 02.11.2010, 16:48
quelle
3

Es scheint, dass die Verwendung von strptime () auf einer Windows-Plattform eine Python-Implementierung (_strptime.py im Lib-Verzeichnis) verwendet. und nicht ein C. Es könnte schneller sein, die Zeichenfolge selbst zu verarbeiten.

%Vor%

gibt 0,000049 auf meinem System zurück, während

%Vor%

gibt 0.000009

zurück     
Andrew Miller 11.10.2011 13:53
quelle
2

Was ist "viel Zeit"? strptime benötigt hier ca. 30 Mikrosekunden:

%Vor%

druckt 0.000031.

    
Glenn Maynard 01.11.2010 17:18
quelle
2

Letzte Antwort: Wenn der Wechsel zu einem geraden strptime() die Laufzeit nicht verbessert hat, dann ist mein Verdacht, dass es hier eigentlich kein Problem gibt: Sie haben einfach ein Programm geschrieben, eines von wessen Hauptzweck im Leben ist, strptime() sehr oft zu nennen, und Sie haben es gut genug geschrieben - mit so wenig anderem, was es tut -, dass die strptime() -Aufrufe durchaus erlaubt sind, die Laufzeit zu dominieren. Ich denke, dass Sie dies als Erfolg und nicht als Misserfolg betrachten könnten, es sei denn, Sie stellen fest, dass (a) eine Unicode- oder LANG-Einstellung dazu führt, dass strptime() zusätzliche Arbeit leistet oder (b) Sie häufiger aufrufen als erforderlich. Versuchen Sie es natürlich, es nur einmal für jedes zu analysierende Datum aufzurufen. : -)

Follow-up-Antwort nach dem Anzeigen des Beispiel-Datumszeichens: Warten Sie! Warten Sie mal! Warum parst du die Zeile, anstatt nur einen Formatierungsstring wie:

zu verwenden %Vor%

Ursprüngliche Off-The-Cuff-Antwort : Wenn der Monat eine Ganzzahl wäre, könnten Sie etwas tun:

%Vor%

und vermeide es, eine große Zeichenkette zu erstellen, nur damit strptime() sie wieder auseinander bricht. Ich frage mich, ob es eine Möglichkeit gibt, direkt auf die Monatslogik zuzugreifen, um diese eine Textkonvertierung durchzuführen?

    
Brandon Rhodes 01.11.2010 16:33
quelle

Tags und Links