我需要逐字节读取大的二进制文件,并试图尽可能加快速度。
我正在使用这个(远非完美的)定时器上下文:
import time
from contextlib import contextmanager
@contextmanager
def timethis(label):
start = time.time()
try:
yield
finally:
end = time.time()
print('%s: %0.3f' % (label, end-start))
然后我有一个测试函数,该函数在每个字节的给定read_funcion
字节上进行迭代。
def test(read_function):
with timethis(read_function.__name__):
# buffering seems to make no difference
# with DATA_PATH.open('br', buffering=8192) as file:
with DATA_PATH.open('br') as file:
for byte in read_function(file):
pass
我的DATA_PATH
和python 3.7.2 source code ...
from pathlib import Path
DATA_PATH = Path('~/Downloads/Python-3.7.2.tgz').expanduser()
现在,我比较了两个读取函数(一个在bytes
上返回迭代器;第二个函数产生更长的bytes
;对这些函数进行迭代将产生int
s)
def read1(file):
return iter(partial(file.read, 1), b"")
def read2(file):
for buffer in iter(partial(file.read, 8192), b""):
yield from buffer
当我用
测试时test(read1)
test(read2)
我看到了很大的不同:第二个版本更快。
为什么open
方法中的缓冲参数不能产生与手工缓冲相同的速度?有一个更好的方法吗? python中已经有一些东西可以帮我完成所有工作(我希望io.BufferedReader
可以-但事实证明我的变量file
已经是BufferedReader
)。