Saat bekerja pada skrip yang sama sekali berbeda, saya telah belajar bahwa dengan 29 juta baris teks, menggunakan seek()
dan mengoperasikan data dengan sendirinya seringkali lebih cepat daripada secara garis demi garis. Gagasan yang sama diterapkan dalam skrip di bawah ini: kita membuka file, dan alih-alih membuka dan menutup file (yang dapat menambah overhead, meskipun tidak signifikan), kita tetap membuka file dan mencari kembali ke awal.
#!/usr/bin/env python3
from __future__ import print_function
import sys,os
def error_out(string):
sys.stderr.write(string+"\n")
sys.exit(1)
def read_bytewise(fp):
data = fp.read(1024)
print(data.decode(),end="",flush=True)
while data:
data = fp.read(1024)
print(data.decode(),end="",flush=True)
#fp.seek(0,1)
def main():
howmany = int(sys.argv[1]) + 1
if not os.path.isfile(sys.argv[2]):
error_out("Needs a valid file")
fp = open(sys.argv[2],'rb')
for i in range(1,howmany):
#print(i)
fp.seek(0)
read_bytewise(fp)
fp.close()
if __name__ == '__main__': main()
Script itu sendiri cukup sederhana dalam penggunaan:
./repeat_text.py <INT> <TEXT.txt>
Untuk file teks 3 baris dan 1000 iterasi berjalan cukup baik, sekitar 0,1 detik:
$ /usr/bin/time ./repeat_text.py 1000 input.txt > /dev/null
0.10user 0.00system 0:00.23elapsed 45%CPU (0avgtext+0avgdata 9172maxresident)k
0inputs+0outputs (0major+1033minor)pagefaults 0swaps
Script itu sendiri tidak paling elegan, mungkin bisa disingkat, tetapi berhasil. Tentu saja, saya menambahkan beberapa bit tambahan di sana-sini, seperti error_out()
fungsi, yang tidak perlu - itu hanya sentuhan kecil yang ramah pengguna.