该功能:
PyObject_GetBuffer
PyBuffer_Release
PyBuffer_Release
调用PyBufferProcs.bf_releasebuffer(PyObject *exporter, Py_buffer *view)
,根据文档,它们可以_“释放与view
相关的所有内存” _,并且不要求view
仍然存活只要exporter
。
因此,原则上,一个类型会在bf_getbuffer
中动态为其分配缓冲区,并在最后一个使用版本释放时将其删除,这会在numpy中导致使用后释放。
我不知道是否有缓冲协议的实现者实际这样做,但是我的理解是允许他们这样做。
这很奇怪。 我想我想如果缓冲区接口指定当缓冲区结构字段(例如步幅等)由PyBuffer_Release
释放时,指向的实际内存必须归原始对象所有(这将用非常烦人的_dealloc_cached_buffer_info
解决我们的问题。 我认为这是意图和真实,但是...
现在,此函数返回PyArray_Chunk
而不是缓冲区,因此,如果您在上面说的很清楚,它实际上就可以了。
您的解释听起来更合理-对python / cpython的请求可能是明智的,以更新文档以告诉人们不要实现我上面描述的内容。
本来打算开放,但是先去吃午饭: https : 非常丑陋且非常慢的代码(当前,它使标量数学的运行速度降低了20%以上)。 (编辑:但是我想只有在Python修复了他们的ArgParse代码之后:()
这增加了一些清晰度,谢谢-我还没有意识到python使用的读取与bf_releasebuffer
相同。
该死的,我之前(从PEP)已经过分理解:
如果导出程序可以重新分配它们可能通过结构bufferinfo共享的内存,步幅,形状,子偏移量或格式变量,则它们需要定义bf_releasebuffer函数。
读起来就像给缓冲区一个新的内存块((。
尽管:查看array
(Python一个)的实现,但它所做的只是使用它来确保在存在缓冲区的情况下禁用大小调整。