【发布时间】:2011-11-24 12:19:10
【问题描述】:
我有一个使用 ctypes 调用 Python 的 C++ 回调函数。这个函数的参数是一个指向双精度数组和元素个数的指针。
有很多元素,大约 2,000,000。我需要将其发送到 scipy 函数中。
C++ 原型是:
bool (*ptsetDataSource)(double*, long long);
这是下面的python代码:
CPF_setDataSource = CFUNCTYPE(c_bool, POINTER(c_double),c_longlong)
CPF_setSelection= CFUNCTYPE(c_bool,c_char_p, c_longlong,c_longlong)
CPF_ResetSequence = CFUNCTYPE(c_bool)
def setDataSource(Data, DataLength):
Datalist=[0.0]*100
for i in range(0,100):
Datalist[i]=Data[i]
print Datalist
return True
问题是打印数据列表返回:
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
这是不正确的(在 c++ 端检查时,数据填充了很多其他数字。
另外,如果我使用此代码将数据转换为 python 列表,它会在分配步骤锁定计算机。
是否可以从 C++ 数组中加载数据,然后将其转换为适合 scipy 的数组?
【问题讨论】:
-
标准的 python 列表永远不会很快。如果您在代码的 C++ 方面很灵活,我会亲自使用 numpy“数组”对象的 C API。示例代码(使用 swig 而不是 ctypes):github.com/martinxyz/python/blob/master/realistic/hello.hpp
-
你能展示一下数据是如何分配的,你是如何从 Python 中调用各种 C 函数的,然后你是如何调用 setDataSource 的吗?