现在,我使用字符串,StringIO或cStringIO缓冲字节。但是,我经常需要从缓冲区的左侧删除字节。一种天真的方法会重建整个缓冲区。如果左截断是一种非常常见的操作,是否有最佳方法可以做到这一点? Python的垃圾收集器实际上应该GC截断字节。

任何类型的算法(将缓冲区保持在小块中?)或现有实现都会有所帮助。

编辑:

我尝试使用Python 2.7的内存视图,但遗憾的是,“视图”之外的数据。删除原始参考时未进行GC设置:

# (This will use ~2GB of memory, not 50MB)

memoryview # Requires Python 2.7+

smalls = []

for i in xrange(10):
    big = memoryview('z'*(200*1000*1000))
    small = big[195*1000*1000:]
    del big
    smalls.append(small)
    print '.',
有帮助吗?

解决方案

如果左移除操作是 deque 将是有效的频繁的(与使用列表,字符串或缓冲区不同,它的分摊O(1)用于任一端删除)。然而,它将比字符串更昂贵的内存,因为您将每个字符存储为自己的字符串对象,而不是打包序列。

或者,您可以创建自己的实现(例如,固定大小的字符串/缓冲区对象的链接列表),这可以更紧凑地存储数据。

其他提示

将缓冲区构建为字符或行列表并对列表进行切片。仅在输出上以字符串形式连接。对于大多数类型的“可变字符串”行为,这非常有效。

GC将收集截断的字节,因为它们不再在列表中引用。

更新:要修改列表头,您只需反转列表即可。这听起来像是一个低效的事情,但python的列表实现在内部对此进行了优化。

来自 http://effbot.org/zone/python-list.htm

  

逆转很快,所以暂时   反转列表通常可以加快速度   如果你需要删除和   在该处插入一堆物品   列表的开头:

L.reverse()
# append/insert/pop/delete at far end
L.reverse()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top