Mantenere il file aperto oppure chiudere subito?

l
laertleba (2840 points)
8 26 41
asked Nov 15, 2021 in HW4 by laertleba (2,840 points)
Ciao a tutti,

sono curioso su quale approcio potrebbe essere piu efficente per il tempo del mio programma, mantenere il with open aperto e eseguire tutto il codice li dentro, oppure coppiare il testo e chiudere il file subito

3 Answers

g
giac (2790 points)
7 14 27
answered Nov 15, 2021 by giac (2,790 points)
Non me ne intendo, ma più che una questione di efficienza, tenere un file inutile aperto occupa memoria. Probabilmente non cambia quasi nulla, ma è buona prassi chiudere tutto ciò che non serve al più presto
Exyss (21390 points)
1 2 79
answered Nov 15, 2021 by Exyss (21,390 points)
edited Nov 15, 2021 by Exyss

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)}")

S
S3b4stian82 (2250 points)
3 6 27
answered Nov 15, 2021 by S3b4stian82 (2,250 points)
Io di solito uso il blocco "with open(.....) as file:" e indento sotto solo le istruzioni per leggere il file.