ในขณะที่ทำงานกับสคริปต์ที่แตกต่างอย่างสิ้นเชิงฉันได้เรียนรู้ว่าด้วยข้อความ 29 ล้านบรรทัดการใช้seek()
และการดำเนินการกับข้อมูล bytewise มักจะเร็วกว่าแบบทีละบรรทัด แนวคิดเดียวกันนี้ถูกนำไปใช้ในสคริปต์ด้านล่าง: เราเปิดไฟล์และแทนที่จะวนซ้ำผ่านการเปิดและปิดไฟล์ (ซึ่งอาจเพิ่มโอเวอร์เฮดแม้ว่าจะไม่มีนัยสำคัญ) เราเปิดไฟล์ไว้และกลับไปสู่จุดเริ่มต้น
#!/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()
สคริปต์นั้นใช้งานง่ายมาก:
./repeat_text.py <INT> <TEXT.txt>
สำหรับไฟล์ข้อความ 3 บรรทัดและ 1,000 การวนซ้ำมันจะไม่เป็นไรประมาณ 0.1 วินาที
$ /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
ตัวสคริปต์ไม่ได้สวยที่สุดอาจจะสั้นลง แต่ทำงานได้ แน่นอนฉันได้เพิ่มบิตพิเศษอีกเล็กน้อยที่นี่เช่นเดียวกับerror_out()
ฟังก์ชั่นซึ่งไม่จำเป็น - มันเป็นเพียงการสัมผัสที่ใช้งานง่ายขนาดเล็ก