पूरी तरह से अलग स्क्रिप्ट पर काम करते हुए, मैंने सीखा है कि 29% लाइनों के साथ, टेक्स्ट का उपयोग करना seek()
और डेटा का उपयोग करना अक्सर लाइन-बाय-लाइन आधार की तुलना में तेज़ होता है। नीचे दी गई स्क्रिप्ट में समान विचार लागू किया जाता है: हम फ़ाइल खोलते हैं, और फ़ाइल खोलने और बंद करने के माध्यम से लूपिंग के बजाय (जो ओवरहेड जोड़ सकते हैं, भले ही महत्वपूर्ण न हो), हम फ़ाइल को खुला रखते हैं और शुरुआत में वापस चाहते हैं।
#!/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 पंक्ति पाठ फ़ाइल और 1000 पुनरावृत्ति के लिए यह बिल्कुल ठीक है, लगभग 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()
फंक्शन, जो आवश्यक नहीं है - यह सिर्फ एक छोटा उपयोगकर्ता-अनुकूल स्पर्श है।