If you are writing a lot of data and speed is a concern you should probably go with f.write(...)
. I did a quick speed comparison and it was considerably faster than print(..., file=f)
when performing a large number of writes.
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)
On average write
finished in 2.45s on my machine, whereas print
took about 4 times as long (9.76s). That being said, in most real-world scenarios this will not be an issue.
If you choose to go with print(..., file=f)
you will probably find that you'll want to suppress the newline from time to time, or replace it with something else. This can be done by setting the optional end
parameter, e.g.;
with open("test", 'w') as f:
print('Foo1,', file=f, end='')
print('Foo2,', file=f, end='')
print('Foo3', file=f)
Whichever way you choose I'd suggest using with
since it makes the code much easier to read.
Update: This difference in performance is explained by the fact that write
is highly buffered and returns before any writes to disk actually take place (see this answer), whereas print
(probably) uses line buffering. A simple test for this would be to check performance for long writes as well, where the disadvantages (in terms of speed) for line buffering would be less pronounced.
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")
The performance difference now becomes much less pronounced, with an average time of 2.20s for write
and 3.10s for print
. If you need to concatenate a bunch of strings to get this loooong line performance will suffer, so use-cases where print
would be more efficient are a bit rare.