Warum ist das Drucken von Stdout so langsam? Kann es beschleunigt werden?Python

Python-Programme
Anonymous
 Warum ist das Drucken von Stdout so langsam? Kann es beschleunigt werden?

Post by Anonymous »

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: Select all

print_timer.py
'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: Select all

$ 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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post