Ich war immer erstaunt/frustriert darüber, wie lange es dauert, einfach mit einer Druckanweisung an das Terminal auszugeben. Nach einigen kürzlich schmerzhaft langsamen Protokollierung entschied ich mich, es zu prüfen und war ziemlich überrascht, dass fast alle < /strong> die Zeit darauf wartet, dass das Terminal die Ergebnisse verarbeitet.
'am Ende dieser Frage), um das Timing beim Schreiben von 100K -Zeilen mit STDOut, mit der Datei und mit STDOut zu vergleichen, die zu/dev/null umgeleitet wurden. Hier ist das Timing -Ergebnis: < /p>
$ python print_timer.py
this is a test
this is a test
this is a test
-----
timing summary (100k lines each)
-----
print :11.950 s
write to file (+ fsync) : 0.122 s
print with stdout = /dev/null : 0.050 s
< /code>
Wow. Um sicherzustellen, dass Python nicht hinter den Kulissen etwas unternimmt, um zu erkennen, dass ich Stdout zu /dev /null oder so neu zugewiesen habe, habe ich die Umleitung außerhalb des Skripts gemacht ... < /p>
$ python print_timer.py > /dev/null
-----
timing summary (100k lines each)
-----
print : 0.053 s
write to file (+fsync) : 0.108 s
print with stdout = /dev/null : 0.045 s
< /code>
Es ist also kein Python -Trick, es ist nur das Terminal. Ich wusste immer, dass Dumping Output to /Dev /Null Sped Things Up, aber ich habe nie gedacht, dass es so bedeutsam war! Wie kann es sein, dass das Schreiben auf physischer Scheibe viel schneller ist als das Schreiben auf den "Bildschirm" (vermutlich ein All-Ram-Op) und effektiv so schnell wie einfach mit dem Müll mit /dev /null zu werfen? auf " ... aber ich verstehe es nicht vollständig. Was kann so lange dauern? Die wirklich langsamen Zahlen oben sind mit meinem Gnom -Terminal bis auf 1920x1200 geblasen. Wenn ich es sehr klein reduziere, bekomme ich ... < /p>
-----
timing summary (100k lines each)
-----
print : 2.920 s
write to file (+fsync) : 0.121 s
print with stdout = /dev/null : 0.048 s
< /code>
Das ist sicherlich besser (~ 4x), ändert aber meine Frage nicht. Es fügt meiner Frage nur hinzu, da ich nicht verstehe, warum das Rendering des Terminalbildschirms eine Anwendung verlangsamen sollte, die auf stdout schreibt. Warum muss mein Programm warten, bis der Bildschirm die Rendering fortgesetzt wird? Ich muss noch experimentieren. Es scheint mir wirklich, als ob ein Terminal in der Lage sein sollte, alle eingehenden Daten zu puffern, sie unsichtbar zu analysieren/zu rendern und nur das neueste Chunk zu rendern, das in der aktuellen Bildschirmkonfiguration zu einer vernünftigen Bildrate sichtbar ist. Wenn ich also+FSYNC in ~ 0,1 Sekunden schreiben kann, sollte ein Terminal in der Lage sein, dieselbe Operation in etwas dieser Bestellung abzuschließen (mit möglicherweise wenigen Bildschirmaktualisierungen, während es es geschafft hat). Wenn dies ausschließlich ein terminales Anwendungsproblem ist, gehört dies möglicherweise nicht einmal zum Stackoverflow? < /P>
Was fehlt mir?import time, sys, tty
import os
lineCount = 100000
line = "this is a test"
summary = ""
cmd = "print"
startTime_s = time.time()
for x in range(lineCount):
print line
t = time.time() - startTime_s
summary += "%-30s:%6.3f s\n" % (cmd, t)
#Add a newline to match line outputs above...
line += "\n"
cmd = "write to file (+fsync)"
fp = file("out.txt", "w")
startTime_s = time.time()
for x in range(lineCount):
fp.write(line)
os.fsync(fp.fileno())
t = time.time() - startTime_s
summary += "%-30s:%6.3f s\n" % (cmd, t)
cmd = "print with stdout = /dev/null"
sys.stdout = file(os.devnull, "w")
startTime_s = time.time()
for x in range(lineCount):
fp.write(line)
t = time.time() - startTime_s
summary += "%-30s:%6.3f s\n" % (cmd, t)
print >> sys.stderr, "-----"
print >> sys.stderr, "timing summary (100k lines each)"
print >> sys.stderr, "-----"
print >> sys.stderr, summary
Ich war immer erstaunt/frustriert darüber, wie lange es dauert, einfach mit einer Druckanweisung an das Terminal auszugeben. Nach einigen kürzlich schmerzhaft langsamen Protokollierung entschied ich mich, es zu prüfen und war ziemlich überrascht, dass fast alle < /strong> die Zeit darauf wartet, dass das Terminal die Ergebnisse verarbeitet.[code]print_timer.py[/code] 'am Ende dieser Frage), um das Timing beim Schreiben von 100K -Zeilen mit STDOut, mit der Datei und mit STDOut zu vergleichen, die zu/dev/null umgeleitet wurden. Hier ist das Timing -Ergebnis: < /p>
[code]$ python print_timer.py this is a test this is a test
this is a test ----- timing summary (100k lines each) ----- print :11.950 s write to file (+ fsync) : 0.122 s print with stdout = /dev/null : 0.050 s < /code>
Wow. Um sicherzustellen, dass Python nicht hinter den Kulissen etwas unternimmt, um zu erkennen, dass ich Stdout zu /dev /null oder so neu zugewiesen habe, habe ich die Umleitung außerhalb des Skripts gemacht ... < /p>
$ python print_timer.py > /dev/null ----- timing summary (100k lines each) ----- print : 0.053 s write to file (+fsync) : 0.108 s print with stdout = /dev/null : 0.045 s < /code>
Es ist also kein Python -Trick, es ist nur das Terminal. Ich wusste immer, dass Dumping Output to /Dev /Null Sped Things Up, aber ich habe nie gedacht, dass es so bedeutsam war! Wie kann es sein, dass das Schreiben auf physischer Scheibe viel schneller ist als das Schreiben auf den "Bildschirm" (vermutlich ein All-Ram-Op) und effektiv so schnell wie einfach mit dem Müll mit /dev /null zu werfen? auf " ... aber ich verstehe es nicht vollständig. Was kann so lange dauern? Die wirklich langsamen Zahlen oben sind mit meinem Gnom -Terminal bis auf 1920x1200 geblasen. Wenn ich es sehr klein reduziere, bekomme ich ... < /p>
----- timing summary (100k lines each) ----- print : 2.920 s write to file (+fsync) : 0.121 s print with stdout = /dev/null : 0.048 s < /code>
Das ist sicherlich besser (~ 4x), ändert aber meine Frage nicht. Es fügt meiner Frage nur hinzu, da ich nicht verstehe, warum das Rendering des Terminalbildschirms eine Anwendung verlangsamen sollte, die auf stdout schreibt. Warum muss mein Programm warten, bis der Bildschirm die Rendering fortgesetzt wird? Ich muss noch experimentieren. Es scheint mir wirklich, als ob ein Terminal in der Lage sein sollte, alle eingehenden Daten zu puffern, sie unsichtbar zu analysieren/zu rendern und nur das neueste Chunk zu rendern, das in der aktuellen Bildschirmkonfiguration zu einer vernünftigen Bildrate sichtbar ist. Wenn ich also+FSYNC in ~ 0,1 Sekunden schreiben kann, sollte ein Terminal in der Lage sein, dieselbe Operation in etwas dieser Bestellung abzuschließen (mit möglicherweise wenigen Bildschirmaktualisierungen, während es es geschafft hat). Wenn dies ausschließlich ein terminales Anwendungsproblem ist, gehört dies möglicherweise nicht einmal zum Stackoverflow? < /P>
Was fehlt mir?import time, sys, tty import os
lineCount = 100000 line = "this is a test" summary = ""
cmd = "print" startTime_s = time.time() for x in range(lineCount): print line t = time.time() - startTime_s summary += "%-30s:%6.3f s\n" % (cmd, t)
#Add a newline to match line outputs above... line += "\n"
cmd = "write to file (+fsync)" fp = file("out.txt", "w") startTime_s = time.time() for x in range(lineCount): fp.write(line) os.fsync(fp.fileno()) t = time.time() - startTime_s summary += "%-30s:%6.3f s\n" % (cmd, t)
cmd = "print with stdout = /dev/null" sys.stdout = file(os.devnull, "w") startTime_s = time.time() for x in range(lineCount): fp.write(line) t = time.time() - startTime_s summary += "%-30s:%6.3f s\n" % (cmd, t)
Das DF enthält 100 Millionen Zeilen und die Spalten „group_by“ sind etwa 25–30. Gibt es eine Möglichkeit, diesen Vorgang von hier aus zu beschleunigen? oder das ist das Beste, was ich bekommen kann....
Ich erstelle eine Frage- und Antwortseite im Akkordeon-Stil für ein aktuelles Projekt. Die Antwort auf die Frage wird durch Klicken auf die Frage angezeigt. Mein Ansatz besteht darin, die Antwort mit...
Ich erstelle eine Frage- und Antwortseite im Akkordeon-Stil für ein aktuelles Projekt. Die Antwort auf die Frage wird durch Klicken auf die Frage angezeigt. Mein Ansatz besteht darin, die Antwort mit...
Ich habe ein ähnliches Problem wie das hier, in dem ich eine P/aufgerufene Dll -Dll -DLLL habe, die auf Stdout schreibt, und ich möchte das verhindern. In meinem Fall würde ich sie anstatt sie in...
Warum ist Print (Zeile) in read_stdout jedes Zeichen anstelle der gesamten Zeile druckt? Ich gehe davon aus plugin_test.py :
from subprocess import PIPE, Popen
from threading import Thread
from...