Python 2.7为缓冲区和内存视图对象引入了一个新的API。
我阅读了关于它们的文档,我想我已经掌握了基本概念(以原始形式访问对象的内部数据而不复制它,我想这意味着获得对象数据的"更快、更少内存占用"的方法(,但要真正理解文档,读者应该对C有超出我所掌握的知识。
如果有人能抽出时间来:,我将不胜感激
- 用"外行术语"解释缓冲区和内存视图对象
- 描述一个场景,其中使用缓冲区和memoryview对象将是"Python方式">
这是我编写的哈希函数中的一行:
M = tuple(buffer(M, i, Nb) for i in range(0, len(M), Nb))
这将把一个长字符串M拆分为长度为Nb的较短"字符串",其中Nb是我一次可以处理的字节/字符数。它在不复制字符串任何部分的情况下完成了这一操作,如果我对字符串进行切片,就会发生这种情况:
M = tuple(M[i*Nb:i*Nb+Nb] for i in range(0, len(M), Nb))
我现在可以像切片一样迭代M:
H = key
for Mi in M:
H = encrypt(H, Mi)
基本上,缓冲区和内存视图是处理Python中字符串的不变性以及切片等一般复制行为的有效方法。内存视图就像缓冲区一样,只是你也可以对它进行写入,而不仅仅是读取。
虽然主缓冲区/内存视图文档是关于C实现的,但标准类型页面在内存视图下有一些信息:http://docs.python.org/library/stdtypes.html#memoryview-型
编辑:在我的书签中找到了这个,http://webcache.googleusercontent.com/search?q=cache:Ago7BXl1_qUJ:mattgattis.com/2010/3/9/python-内存视图+站点:mattgatis.com+python&hl=en&client=firefox-a&gl=us&strip=1是一篇非常好的简短文章。
编辑2:原来我是从"什么时候应该使用内存视图?"?首先,这个问题从来没有得到详细的回答,而且这个链接已经死了,所以希望这能有所帮助。
我想要的部分答案是buffer
是"旧方法",memoryview
是新方法,但被后移植到2.7-请参阅此处的存档博客
这并不能回答我的问题,为什么我认为我在2.7中实现的C API允许我构建buffer
,而不是memoryview
。。。
要使memoryview
在Python2.7中工作,需要在tp_flags
中设置Py_TPFLAGS_HAVE_NEWBUFFER
标志。我发现内置的bytearray
源代码是一个很好的参考;它在CCD_ 9和CCD_。