python中的二进制文件:缓冲读取

时间:2019-02-21 08:32:08

标签: python python-3.x binaryfiles

我需要逐字节读取大的二进制文件,并试图尽可能加快速度。

我正在使用这个(远非完美的)定时器上下文:

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_PATHpython 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)。

0 个答案:

没有答案