Python-String-Formatierung zu langsam

8

Ich verwende den folgenden Code, um eine Karte zu loggen, sie ist schnell, wenn sie nur Nullen enthält, aber sobald es tatsächlich Daten in der Karte gibt, wird es unerträglich langsam ... Gibt es eine Möglichkeit, dies schneller zu machen? / p> %Vor%     

wich 14.04.2010, 13:03
quelle

3 Antworten

3

Ich schlage vor, dass Sie Ihren Code mit dem cProfile -Modul ausführen und die Ergebnisse wie in Ссылка beschrieben nachbearbeiten. Dadurch erfahren Sie genau, wie viel Zeit für den Aufruf von str.__mod__ für die Zeichenfolgenformatierung aufgewendet wird und wie viel Zeit für andere Dinge aufgewendet wird, z. B. das Schreiben der Datei und die __getitem__ -Suchen nach map[0][i] und so.

    
Mike Graham 14.04.2010, 16:31
quelle
2

Zuerst habe ich% gegen Backquoting überprüft. % ist schneller. Dann habe ich% (Tupel) gegen 'string'.format () überprüft. Ein anfänglicher Fehler ließ mich denken, dass es schneller war. Aber nein. % ist schneller.

Sie machen also Ihren riesigen Stapel von Fließkomma-zu-String-Konvertierungen auf dem schnellsten Weg, den Sie in Python machen können.

Der folgende Demo-Code ist hässlicher Demo-Code. Bitte lehre mich nicht über Xrange versus Range oder andere Pedanterie. KThxBye.

Meine Ad-hoc- und sehr unwissenschaftlichen Tests zeigen, dass (a)% (1.234,) auf Python 2.5 unter Linux schneller ist als% (1.234, ...) unter Python 2.6 unter Linux, für den folgenden Testcode, mit der Maßgabe, dass der Versuch, 'string'.format () zu verwenden, bei Python-Versionen vor 2.6 nicht funktioniert. Und so weiter.

%Vor%

Ich denke, Sie könnten Ihren Code optimieren, indem Sie Ihre TUPLES floats irgendwo anders aufbauen, wo immer Sie diese Map erstellt haben, zuerst Ihre Tupel-Liste erstellen und dann das fmt_string% -Tupel auf diese Weise anwenden:

%Vor%

Ich konnte die 8,7 Sekunden auf 8,5 Sekunden reduzieren, indem ich den Making-A-Tuple-Teil aus der for-Schleife löschte. Was nicht viel ist. Der große Junge dort ist Fließkommaformatierung, die ich glaube, wird immer teuer sein.

Alternative:

Haben Sie darüber nachgedacht, solche riesigen Protokolle nicht als Text zu schreiben und sie stattdessen mit der schnellsten verfügbaren "Persistenz" -Methode zu speichern und dann ein kurzes Dienstprogramm zu schreiben, um sie bei Bedarf in den Text zu schreiben? Einige Leute verwenden NumPy mit sehr großen numerischen Datensätzen und es scheint nicht, dass sie einen zeilenweisen Speicherabzug verwenden würden, um ihre Daten zu speichern. Siehe:

Ссылка

    
Warren P 14.04.2010 17:41
quelle
0

Ohne in den Optimize-This-Code-Morast waten zu wollen, hätte ich den Code eher so geschrieben:

%Vor%

Aber ich werde mich mit der Empfehlung, dass Sie Variablen nach Python-Buildern nicht benennen, wie map , abfinden.

    
hughdbrown 14.04.2010 20:51
quelle

Tags und Links