Wenn Sie viele Daten schreiben und Geschwindigkeit ein Problem ist, sollten Sie sich wahrscheinlich dafür entscheiden f.write(...)
. Ich habe einen schnellen Geschwindigkeitsvergleich durchgeführt und er war erheblich schneller als print(..., file=f)
bei einer großen Anzahl von Schreibvorgängen.
import time
start = start = time.time()
with open("test.txt", 'w') as f:
for i in range(10000000):
# print('This is a speed test', file=f)
# f.write('This is a speed test\n')
end = time.time()
print(end - start)
Im Durchschnitt write
in 2.45s auf meiner Maschine beendet, währendprint
etwa 4-mal so lange (9,76s) dauerte. In den meisten realen Szenarien ist dies jedoch kein Problem.
Wenn Sie sich dafür entscheiden, werden print(..., file=f)
Sie wahrscheinlich feststellen, dass Sie die neue Zeile von Zeit zu Zeit unterdrücken oder durch etwas anderes ersetzen möchten. Dies kann durch Einstellen des optionalen end
Parameters erfolgen, z.
with open("test", 'w') as f:
print('Foo1,', file=f, end='')
print('Foo2,', file=f, end='')
print('Foo3', file=f)
Welchen Weg Sie auch wählen, ich würde vorschlagen, ihn zu verwenden, with
da er den Code viel einfacher zu lesen macht.
Update : Dieser Leistungsunterschied erklärt sich aus der Tatsache, dass er write
stark gepuffert ist und zurückkehrt, bevor tatsächlich Schreibvorgänge auf die Festplatte stattfinden (siehe diese Antwort ), während print
(wahrscheinlich) die Zeilenpufferung verwendet wird. Ein einfacher Test hierfür wäre, die Leistung auch für lange Schreibvorgänge zu überprüfen, bei denen die Nachteile (in Bezug auf die Geschwindigkeit) für die Zeilenpufferung weniger ausgeprägt wären.
start = start = time.time()
long_line = 'This is a speed test' * 100
with open("test.txt", 'w') as f:
for i in range(1000000):
# print(long_line, file=f)
# f.write(long_line + '\n')
end = time.time()
print(end - start, "s")
Der Leistungsunterschied wird jetzt mit einer durchschnittlichen Zeit von 2,20 s für write
und 3,10 s für viel weniger ausgeprägt print
. Wenn Sie eine Reihe von Zeichenfolgen verketten müssen, um diese lange Leitungsleistung zu erzielen, leidet dies unter Anwendungsfällen, bei denen print
dies effizienter wäre.