Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以从左边截断的Python缓冲区?_Python_String_Buffer_Memoryview - Fatal编程技术网

可以从左边截断的Python缓冲区?

可以从左边截断的Python缓冲区?,python,string,buffer,memoryview,Python,String,Buffer,Memoryview,现在,我正在使用strings、StringIO或cStringIO缓冲字节。但是,我经常需要删除缓冲区左侧的字节。一种简单的方法将重建整个缓冲区。如果左截断是一种非常常见的操作,那么有没有最佳的方法来实现这一点?Python的垃圾收集器实际上应该GC被截断的字节 任何一种算法(将缓冲区保持在小块?)或现有的实现都会很有帮助 编辑: 为此,我尝试使用Python 2.7的memoryview,但遗憾的是,删除原始引用时,“视图”之外的数据没有GCD: # (This will use ~2GB

现在,我正在使用strings、StringIO或cStringIO缓冲字节。但是,我经常需要删除缓冲区左侧的字节。一种简单的方法将重建整个缓冲区。如果左截断是一种非常常见的操作,那么有没有最佳的方法来实现这一点?Python的垃圾收集器实际上应该GC被截断的字节

任何一种算法(将缓冲区保持在小块?)或现有的实现都会很有帮助

编辑:

为此,我尝试使用Python 2.7的memoryview,但遗憾的是,删除原始引用时,“视图”之外的数据没有GCD:

# (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 '.',

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

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

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

发件人:

倒车很快,所以是暂时的 颠倒列表通常可以加快速度 如果您需要删除和删除 在列表中插入一组项目 列表开头:

L.reverse()
# append/insert/pop/delete at far end
L.reverse()
如果左删除操作频繁,则A将是有效的(与使用列表、字符串或缓冲区不同,对于任意一端的删除,它将摊销为O(1))。但是,它在内存方面比字符串更昂贵,因为您将每个字符存储为自己的字符串对象,而不是压缩序列


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

为什么要删除字节?为什么不使用缓冲区并在完成后丢弃整个缓冲区?完整的行(由任意分隔符分隔)将以增量方式从缓冲区中提取并发送到回调。保留缓冲区可能会耗尽内存。“可能会耗尽内存”?真正地有证据吗?除非有证据表明内存确实已耗尽,否则过度优化此类内容很少有帮助。如果您担心此处的效率,您可能希望改用阵列模块中的阵列。但是,对于左侧删除,列表将与缓冲区有相同的问题(内存分配除外)-他们必须复制每个字节以填补删除所造成的漏洞。这不是复制字节,而是复制引用。如果您逐行添加和删除,开销将是最小的。如果没有,您可以反转列表(参见上面的答案),复制引用比处理字符更糟糕-您需要每个条目复制4个字节,而不是1个字节。不过,反向是一个不错的解决方案-一次性反向成本可以防止每次删除都会产生成本,只要您不需要在反向后追加更多数据。deque最近的链接:。谢谢-我已更新了链接。我只是使用了第一个谷歌搜索结果,没有注意到是2.5.2文档。