#!/usr/bin/env python3
import io
def iterate_stream(stream, delimiter, max_read_size=1024):
""" Reads `delimiter` separated strings or bytes from `stream`. """
empty = '' if isinstance(delimiter, str) else b''
chunks = []
while 1:
d = stream.read(max_read_size)
if not d:
break
while d:
i = d.find(delimiter)
if i < 0:
chunks.append(d)
break
chunks.append(d[:i+1])
d = d[i+1:]
yield empty.join(chunks)
chunks = []
s = empty.join(chunks)
if s:
yield s
if __name__ == '__main__':
print(next(iterate_stream(io.StringIO('ABCZ123'), 'Z')))
print(next(iterate_stream(io.BytesIO(b'ABCZ123'), b'Z')))
我很失望这个问题只有一个关于堆栈溢出的答案,因为这是一个有趣和相关的问题。不管怎么说,因为只有奥夫戈洛文给出了解决方案,我觉得可能比较慢,所以我想了一个更快的解决方案:
这是分块读取io(可能在第一个块中找不到end char)。它非常快,因为没有为每个字符调用Python函数,相反,最大限度地使用C编写的Python函数。在
这比ovgolovin的解决方案快60倍左右。我运行
timeit
来检查它。在这里
iter
在这种模式下使用:iter(callable, sentinel) -> iterator
。在
^{pr2}$''.join(...)
相当有效。最后一个添加'Z'''.join(i) + 'Z'
的操作不是很好。但可以通过向迭代器添加'Z'
来解决:另一种方法是使用生成器:
我做了一些效率测试。所述技术的性能几乎相同:
http://ideone.com/dQGe5
相关问题 更多 >
编程相关推荐