繁体   English   中英

Ctypes:将返回指针转换为数组或Python列表的快速方法

[英]Ctypes: fast way to convert a return pointer to an array or Python list

我正在使用ctypes将数组指针传递给dll,并返回指向使用dll中的malloc创建的双精度数组的指针。 在返回Python时,我需要一种快速的方法将指针转换为数组或Python列表。

我可以使用这个列表comp,但它很慢,因为有320,000个数据点:

list_of_results = [ret_ptr[i] for i in range(320000)]

理想情况下,我会在Python中创建数组并将其传递给dll,但我必须在dll中使用malloc创建它,因为这是一个动态数组,我事先不知道会有多少数据元素(尽管返回指针也返回数据元素的数量,所以我知道有多少返回Python) - 我使用realloc在dll中动态扩展数组大小; 我可以在Python数组中使用realloc,但最后调用free()并不能保证工作。

Here is the relevant Python code:

CallTest = hDLL.Main_Entry_fn
CallTest.argtypes = [ctypes.POINTER(ctypes.c_double), ctypes.c_int64]
CallTest.restype = ctypes.POINTER(ctypes.c_double)
ret_ptr = CallTest(DataArray, number_of_data_points)
list_of_results = [ret_ptr[i] for i in range(320000)]

所以我的问题是:将从dll返回的指针转换为Python列表或数组的最快方法是什么? 上面显示的方法太慢了。

非常感谢。

切片ctypes数组或指针将自动生成一个列表:

list_of_results = ret_ptr[:320000]

根据“将指针转换为数组”的含义以及可以使用的输出类型,您可以做得更好。 例如,您可以直接使用缓冲区支持NumPy数组,而不进行数据复制:

buffer_as_ctypes_array = ctypes.cast(ret_ptr, ctypes.POINTER(ctypes.c_double*320000))[0]
buffer_as_numpy_array = numpy.frombuffer(buffer_as_ctypes_array, numpy.float64)

如果你在需要的时候释放缓冲区,这当然会破坏性的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM