首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >填充python ctypes指针

填充python ctypes指针
EN

Stack Overflow用户
提问于 2012-05-24 11:41:28
回答 2查看 2.8K关注 0票数 2

我有一个C函数uint8_t *begin();,它返回一个指向已分配内存的指针。

下面是它的ctypes绑定:

代码语言:javascript
复制
begin = mylibrary.begin
begin.argtypes = ()
begin.restype = ctypes.POINTER(ctypes.c_uint8)

我需要用一个整数数组来填充内存。有没有比这个更快的方法呢?

代码语言:javascript
复制
buffer = begin()
data = range(10)
for idx, value in enumerate(data):
    buffer[idx] = ctypes.c_uint8(value)

在我看来,迭代整个数组并不是一种非常快速的方法,因为可迭代的数据可以包含许多项,数百万个整数或类似的东西。

EN

回答 2

Stack Overflow用户

发布于 2012-05-31 04:08:41

如果您可以添加依赖项,则numpy会使这一点变得更容易。

这是我放在一起的一个例子。

C(注意长度设置为10)

代码语言:javascript
复制
#include <stdlib.h>
int *begin(void) {
    return calloc(10, sizeof(int));
}

和巨蟒

代码语言:javascript
复制
import numpy as np
import ctypes
# make the data I want to put into C
data = np.arange(10, dtype=ctypes.c_int)
# setup the ctypes just as you did
mylibrary = ctypes.CDLL('a.out')
begin = mylibrary.begin
begin.argtypes = ()
begin.restype = ctypes.POINTER(ctypes.c_int)
# and do the same memmove that Kirill suggested
ctypes.memmove(buffer, data.ctypes.get_data(), ctypes.sizeof(ctypes.c_int)*len(data))
# and print some out
print buffer[2]
# 2

如果你对numpy很在行,你也可以用这种方式做多维数组。

人们需要考虑一下谁拥有内存,以及如何在接近底层C时清除它,而不是分段错误(或泄漏)。例如,del buffer不会释放创建的缓冲区,这必须在C中完成。

票数 2
EN

Stack Overflow用户

发布于 2012-05-24 13:15:20

Python list有相应的C type,我猜它有PyObject的内部C数组。因此,你必须迭代列表项才能将它们转换成int的。也许有一些技巧可以将它写在一行中,但我认为越简单越好。

附注:考虑使用array模块:

代码语言:javascript
复制
>>> import ctypes
>>> from array import array
>>> TenInts = ctypes.c_int * 10
>>> arr = array('i', range(10))
>>> carr = TenInts()
>>> arr_addr, arr_len = arr.buffer_info()[0], len(arr) * arr.itemsize
>>> ctypes.memmove(carr, arr_addr, arr_len)
13893440
>>> print '; '.join(map(str, carr))
0; 1; 2; 3; 4; 5; 6; 7; 8; 9
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10730841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档