Oltre al fatto che le best practice della programmazione consigliano altamente il chiudere un file il prima possibile per evitare problematiche di ogni tipo oltre al liberare memoria, sembra che in Python sia comunque più veloce leggere un intero file.
Di seguito ti riporto i test che ho fatto e il codice con cui sono stati realizzati:
[exyss@exyss tmp]$ python test.py 10
Test file intero
Risultato: 0.00012778399968738086
Test linea per linea:
Risultato: 8.946900015871506e-05
[exyss@exyss tmp]$ python test.py 1000
Test file intero
Risultato: 0.00041223800008083344
Test linea per linea:
Risultato: 0.0004529070001808577
[exyss@exyss tmp]$ python test.py 10000
Test file intero
Risultato: 0.0031961709996721765
Test linea per linea:
Risultato: 0.004176653000286024
[exyss@exyss tmp]$ python test.py 100000
Test file intero
Risultato: 0.03202684699999736
Test linea per linea:
Risultato: 0.047025417999975616
[exyss@exyss tmp]$ python test.py 1000000
Test file intero
Risultato: 0.3154057560000183
Test linea per linea:
Risultato: 0.4718759729998965
Codice dei test :
import timeit
from sys import argv
# Come "operazione di test" per cronometrare la velocità dei due metodi
# ho scelto di appendere le varie linee lette all'interno di una lista.
# Per sicurezza ti consiglio di modificare il codice e fare dei tuoi test
def writeLongFile(lines):
with open("file.txt", "w") as f:
for _ in range(lines):
f.write("ciao\n")
readWholeFile = """\
appended = []
with open("file.txt", "r") as f:
lines = f.readlines()
for line in lines:
appended.append(line)
"""
readLineByLine = """\
appended = []
with open("file.txt", "r") as f:
while True:
line = f.readline()
if not line:
break
else:
appended.append(line)
"""
lines = int(argv[1])
writeLongFile(lines)
print("Test file intero")
print(f"Risultato: {timeit.timeit(stmt=readWholeFile, number=1)}")
print("\nTest linea per linea:")
print(f"Risultato: {timeit.timeit(stmt=readLineByLine, number=1)}")