मुझे इसी तरह के सवाल पर पोस्ट करना था जब तक कि मेरा प्रतिष्ठा स्कोर थोड़ा उछल नहीं गया (धन्यवाद जिसने भी मुझे टक्कर दी!)।
ये सभी समाधान इस रन को एक तरह से अनदेखा कर देते हैं, जैसे कि अनफर्ड (कच्चे) इंटरफ़ेस का उपयोग करके, बायट्रीज़ का उपयोग करके, और अपनी स्वयं की बफरिंग करके। (यह केवल पायथन 3 में लागू होता है। पायथन 2 में, कच्चा इंटरफ़ेस डिफ़ॉल्ट रूप से उपयोग किया जा सकता है या नहीं भी हो सकता है, लेकिन पायथन 3 में, आप यूनिकोड में डिफ़ॉल्ट होंगे।)
टाइमिंग टूल के संशोधित संस्करण का उपयोग करना, मेरा मानना है कि निम्न कोड किसी भी समाधान की तुलना में तेज़ (और मामूली रूप से अधिक पायथोनिक) है:
def rawcount(filename):
f = open(filename, 'rb')
lines = 0
buf_size = 1024 * 1024
read_f = f.raw.read
buf = read_f(buf_size)
while buf:
lines += buf.count(b'\n')
buf = read_f(buf_size)
return lines
एक अलग जनरेटर फ़ंक्शन का उपयोग करते हुए, यह तेजी से एक फ्रिज चलाता है:
def _make_gen(reader):
b = reader(1024 * 1024)
while b:
yield b
b = reader(1024*1024)
def rawgencount(filename):
f = open(filename, 'rb')
f_gen = _make_gen(f.raw.read)
return sum( buf.count(b'\n') for buf in f_gen )
इसे पूरी तरह से जेनरेटरों के साथ पूरी तरह से किया जा सकता है, जिसमें इटर्लूल का उपयोग किया जा सकता है, लेकिन यह देखने में काफी अजीब लगता है:
from itertools import (takewhile,repeat)
def rawincount(filename):
f = open(filename, 'rb')
bufgen = takewhile(lambda x: x, (f.raw.read(1024*1024) for _ in repeat(None)))
return sum( buf.count(b'\n') for buf in bufgen )
यहाँ मेरे समय हैं:
function average, s min, s ratio
rawincount 0.0043 0.0041 1.00
rawgencount 0.0044 0.0042 1.01
rawcount 0.0048 0.0045 1.09
bufcount 0.008 0.0068 1.64
wccount 0.01 0.0097 2.35
itercount 0.014 0.014 3.41
opcount 0.02 0.02 4.83
kylecount 0.021 0.021 5.05
simplecount 0.022 0.022 5.25
mapcount 0.037 0.031 7.46