动态数组的buffer protocol正确使用方法咨询
C++动态数组通过Buffer Protocol暴露给Python的疑问
背景与问题
我用C++实现了一个动态数组类型,目前已经将其作为序列暴露给Python。为了更快地基于该数组数据构建NumPy数组——希望用buffer protocol替代逐元素遍历的序列构建方式来提升效率——我想通过buffer protocol暴露这个数组。但问题在于,动态数组的内存可能会发生重分配,有效内存范围会随之变化,而buffer protocol要求暴露的缓冲区在Python buffer对象存活期间必须保持完整。
我想到的解决办法是:在请求buffer时,把数组内容复制到一块新的内存区域,等buffer不再被使用时再释放这块内存。但我不确定这种返回的buffer(不代表Python对象当前实时状态)是否符合buffer protocol的规范。
根据Py_buffer结构体obj字段的文档说明:
作为特殊情况,被PyMemoryView_FromBuffer()或PyBuffer_FillInfo()包装的临时缓冲区,该字段为NULL。一般情况下,导出对象不得使用此方案。
我想确认:每次请求buffer时都复制数据生成的缓冲区,是否属于这类“临时”缓冲区?我知道复制数据违背了buffer protocol零拷贝的初衷,但相比逐元素循环构建NumPy数组,用memcpy复制的效率提升还是很可观的。
内容的提问来源于stack exchange,提问作者javidcf
相关产品推荐
相关产品推荐

