Πρέπει να λάβω τον αριθμό γραμμών ενός μεγάλου αρχείου (εκατοντάδες χιλιάδες γραμμές) σε python. Ποιος είναι ο πιο αποδοτικός τρόπος τόσο από πλευράς μνήμης όσο και από πλευράς χρόνου;
Αυτή τη στιγμή κάνω:
def file_len(fname):
with open(fname) as f:
for i, l in enumerate(f):
pass
return i + 1
Είναι δυνατόν να το κάνω καλύτερα;
Δεν μπορείς να γίνεις καλύτερος από αυτό.
Εξάλλου, οποιαδήποτε λύση θα πρέπει να διαβάσει ολόκληρο το αρχείο, να υπολογίσει πόσα \n
έχετε και να επιστρέψει το αποτέλεσμα.
Έχετε κάποιον καλύτερο τρόπο να το κάνετε αυτό χωρίς να διαβάσετε ολόκληρο το αρχείο; Δεν είμαι σίγουρος... Η καλύτερη λύση θα είναι πάντα I/O-bound, το καλύτερο που μπορείτε να κάνετε είναι να βεβαιωθείτε ότι δεν χρησιμοποιείτε περιττή μνήμη, αλλά φαίνεται ότι το έχετε καλύψει αυτό.
Θα μπορούσατε να εκτελέσετε μια υποδιεργασία και να εκτελέσετε το wc -l filename
.
import subprocess
def file_len(fname):
p = subprocess.Popen(['wc', '-l', fname], stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
result, err = p.communicate()
if p.returncode != 0:
raise IOError(err)
return int(result.strip().split()[0])