আমার খ্যাতি স্কোরটি কিছুটা লাফ না দেওয়া পর্যন্ত আমাকে একই পোস্টে পোস্ট করতে হয়েছিল (যারাই আমাকে ধাক্কা দিয়েছে তাকে ধন্যবাদ!)।
এই সমস্ত সমাধানের পক্ষে এই রানকে আরও দ্রুততর করার একটি উপায় উপেক্ষা করা হয়, যেমন আনফারড (কাঁচা) ইন্টারফেস ব্যবহার করে, বাইটারারি ব্যবহার করে এবং আপনার নিজের বাফারিং করে। (এটি কেবল পাইথন 3 এ প্রযোজ্য Py পাইথন 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