从ctypes指针对象创建NumPy数组是有问题的 *** 作。尚不清楚谁真正拥有指针指向的内存。什么时候可以再次释放?有效期有多长?只要有可能,我都会尽量避免这种构造。在Python代码中创建数组并将其传递给C函数比使用不认识Python的C函数分配的内存要容易得多,更安全。通过执行后者,您在某种程度上会否定使用高级语言进行内存管理的优势。
如果您确实确定有人会照顾内存,则可以创建一个暴露Python“缓冲区协议”的对象,然后使用此缓冲区对象创建一个NumPy数组。您通过未记录的
int_asbuffer()函数给出了一种在帖子中创建缓冲区对象的方法:
buffer = numpy.core.multiarray.int_asbuffer( ctypes.addressof(y.contents), 8*array_length)
(请注意,我替换
8了
np.dtype(float).itemsize。在任何平台上,它始终为8。)创建缓冲区对象的另一种方法是
PyBuffer_FromMemory()通过ctypes从Python
C API调用该函数:
buffer_from_memory = ctypes.pythonapi.PyBuffer_FromMemorybuffer_from_memory.restype = ctypes.py_objectbuffer = buffer_from_memory(y, 8*array_length)
对于这两种方式,您都可以通过以下方式创建一个NumPy数组
buffer:
a = numpy.frombuffer(buffer, float)
(我实际上不明白为什么要使用
.astype()而不是第二个参数
frombuffer;此外,我想知道为什么要使用
np.int,而您之前说过数组包含
doubles。)
恐怕它不会比这容易得多,但这还不是很糟糕,您不觉得吗?您可以将所有难看的细节掩埋在包装函数中,而不必担心它。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)