Skip to main content
 首页 » 编程设计

python之可以从左侧截断的 Python 缓冲区

2024年08月12日36落叶

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

任何类型的算法(将缓冲区分成小块?)或现有的实现都会真正有帮助。

编辑:

我尝试为此使用 Python 2.7 的内存 View ,但遗憾的是,当原始引用被删除时,“ View ”之外的数据没有被 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 '.', 

请您参考如下方法:

A deque如果左侧移除操作频繁,将会很有效(与使用列表、字符串或缓冲区不同,它的两端移除均摊为 O(1))。然而,它在内存方面比字符串更昂贵,因为您会将每个字符存储为它自己的字符串对象,而不是打包序列。

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