将 **float array 从 C++ Dll 传递给 python

Passing **float array from C++ Dll to python

本文关键字:python Dll C++ float array      更新时间:2023-10-16

由于Dll和ctypes,我目前正在使用导入python的C/C++函数。在 DLL 中,我有一个函数,它将浮点 ** 变量作为参数。这个参数在函数中填充,我使用 ctypes 在 python 上恢复它。

我有一个使用 2 for 循环的解决方案,但是当 2D 数组有很多点时,这非常慢。

你知道没有这些 for 循环的方法吗?

这是我的代码:

导出函数 (DLL( 的简短版本

unsigned short ClassExample::GetData(float **Samples)
{
for(long i = 0; i < rows; i++)
{
try
{
if(ch < NB_ROWS_MAX) 
{
Samples[ch]][i] = this->Data[ch][i];
}
else
{
...
}
} ...

蟒蛇代码

def GetSamples(self, ROWS, COLUMN):
Data = (ctypes.POINTER(ctypes.c_float) * ROWS)()
for i in range(COLUMN):
Data[i] = (ctypes.c_float * COLUMN)()
try:
succeed = lib._PyGetData(ClassExampleObj, ctypes.byref(Data))
if succeed != 0:
print("Error number :", succeed)
except:
print("Unknown Error")
Data_np = numpy.zeros((ROWS, COLUMN), dtype=float)
for i in range(ROWS):
for j in range(COLUMN):
Data_np[i, j] = float(Data[i][j])
return Data_np

谢谢!

如果你的问题是效率,那么你可能正在使用非常非常大的数据集。

使 2-D 矩阵迭代速度更快的最简单方法是使其为 1-d。如果您有 X 列和 Y 行,那么您可以访问matrix[i*X+j],而不是访问matrix[I][j],这样可以节省取消引用,并可能节省许多缓存未命中。如果可能的话,您甚至可以更进一步,将矩阵视为一维数组。

另一个节省时间的解决方案是尽可能避免这种情况。如果你在for循环中只有条件,编译器将能够大大优化它。

如果不看到更多的代码,就很难判断您的代码是否效率低下,或者只是为您的计算机处理了太多数据,但我给出的指导方针似乎适合您给出的示例。

我想提到的最后一件事是float非常不精确,如果可能的话,你最好使用double

祝你好运