相关文章推荐
斯文的杯子  ·  Python+Django 核心介绍 - ...·  2 周前    · 
愤怒的风衣  ·  Python 异步 ASGI ...·  2 周前    · 
奔跑的骆驼  ·  结合使用 Oracle Database ...·  2 天前    · 
坐怀不乱的椰子  ·  DwmRegisterThumbnail ...·  2 年前    · 
讲道义的牛肉面  ·  【SpringBoot WebFlux ...·  2 年前    · 
坏坏的饭盒  ·  swiper.min.js.map在chro ...·  2 年前    · 
坏坏的斑马  ·  前端 - vue3+ts ...·  2 年前    · 

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数组,不需要复制数据。