从StringIO读取直到遇到某个字节的快速方法

zah*_*pov 7 python optimization performance stream stringio

假设我有一些StringIO(来自cStringIO).我想从中读取缓冲区,直到遇到某个字符/字节,比如'Z',所以:

stringio = StringIO('ABCZ123')
buf = read_until(stringio, 'Z')  # buf is now 'ABCZ'
# strinio.tell() is now 4, pointing after 'Z'
Run Code Online (Sandbox Code Playgroud)

在Python中执行此操作的最快方法是什么?谢谢

zah*_*pov 6

我非常失望,这个问题在堆栈溢出时只得到一个答案,因为它是有趣且相关的问题.无论如何,因为只有ovgolovin提供解决方案,我认为它可能很慢,我认为更快的解决方案:

def foo(stringio):
    datalist = []
    while True:
        chunk = stringio.read(256)
        i = chunk.find('Z')
        if i == -1:
            datalist.append(chunk)
        else:
            datalist.append(chunk[:i+1])
            break
        if len(chunk) < 256:
            break
    return ''.join(datalist)
Run Code Online (Sandbox Code Playgroud)

这是以块的形式读取io(可能是在第一个块中找不到结束字符).它非常快,因为没有为每个字符调用Python函数,而是相反,C编写的Python函数的最大用法.

比ovgolovin的溶液快60倍.我跑去timeit检查一下.