Se você está escrevendo muitos dados e a velocidade é uma preocupação, provavelmente você deve concordar f.write(...). Fiz uma comparação rápida de velocidade e foi consideravelmente mais rápida do que print(..., file=f)na execução de um grande número de gravações.
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)
Em média, writeterminei em 2,45s na minha máquina, enquanto printdemorou cerca de 4 vezes mais (9,76s). Dito isto, na maioria dos cenários do mundo real, isso não será um problema.
Se você optar por acompanhá- print(..., file=f)lo, provavelmente descobrirá que deseja suprimir a nova linha de tempos em tempos ou substituí-la por outra. Isso pode ser feito configurando o endparâmetro opcional , por exemplo;
with open("test", 'w') as f:
print('Foo1,', file=f, end='')
print('Foo2,', file=f, end='')
print('Foo3', file=f)
Qualquer que seja a maneira que você escolher, sugiro usar, withpois torna o código muito mais fácil de ler.
Atualização : Essa diferença de desempenho é explicada pelo fato de writeser altamente armazenado em buffer e retornar antes que qualquer gravação no disco ocorra (consulte esta resposta ), enquanto print(provavelmente) usa o buffer de linha. Um teste simples para isso seria verificar o desempenho também para gravações longas, onde as desvantagens (em termos de velocidade) do buffer de linha seriam menos pronunciadas.
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")
A diferença de desempenho agora se torna muito menos acentuada, com um tempo médio de 2,20s para writee 3,10s para print. Se você precisar concatenar printvárias seqüências de caracteres para obter esse desempenho muito longo da linha, os casos de uso em que seria mais eficiente são um pouco raros.