මගේ කීර්ති නාමය මඳක් ඉහළ යන තෙක් මට මෙය සමාන ප්රශ්නයක පළ කිරීමට සිදු විය (මට ගැසූ ඕනෑම කෙනෙකුට ස්තූතියි!).
මෙම සියලු විසඳුම් සැලකිය යුතු වේගයකින් ධාවනය කිරීම සඳහා එක් ක්රමයක් නොසලකා හරියි, එනම් නොනවතින (අමු) අතුරුමුහුණත භාවිතා කිරීම, බයිට්රේ භාවිතා කිරීම සහ ඔබේම බෆරින් කිරීම. (මෙය අදාළ වන්නේ පයිතන් 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