相关文章推荐
有情有义的大白菜  ·  python ...·  3 周前    · 
完美的馒头  ·  python QTreeWidget ...·  3 周前    · 
失眠的烤红薯  ·  python qt textBrowser ...·  3 周前    · 
帅气的领带  ·  【Pyspark ...·  5 天前    · 
近视的橙子  ·  python ...·  3 天前    · 
安静的水桶  ·  酷玩获3项格莱美大奖 ...·  5 月前    · 
不拘小节的毛衣  ·  大疆Pocket ...·  6 月前    · 
完美的红薯  ·  Windows 终端安装 | ...·  6 月前    · 

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

5 人关注

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

我可以用这个列表编译,但它很慢,因为有32万个数据点。

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

理想的情况是我在Python中创建数组并把它传给dll,但是我必须在dll中使用malloc来创建它,因为这是一个动态数组,我事先不知道会有多少数据元素(尽管返回指针也会返回数据元素的数量,所以我在返回Python时知道有多少)--我在dll中使用realloc来动态扩展数组大小;我可以对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列表或数组的最快方法是什么? 上面显示的方法太慢了。

非常感谢。

python
arrays
ctypes
RTC222
RTC222
发布于 2018-02-22
1 个回答
user2357112
user2357112
发布于 2018-02-22
已采纳
0 人赞同

切分一个 ctypes 数组或指针将自动产生一个列表。

list_of_results = ret_ptr[:320000]

根据你所说的 "将指针转换为数组 "以及你能处理的输出类型,你也许能做得更好。例如,你可以直接制作一个由缓冲区支持的NumPy数组,不需要复制数据。