【问题标题】:Passing **float array from C++ Dll to python将 **float 数组从 C++ Dll 传递给 python
【发布时间】:2020-10-09 19:28:45
【问题描述】:

我目前正在使用导入到 python 的 C/C++ 函数,这要归功于 Dll 和 ctypes。在 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
            {
                ...
            }
        } ...

Python 代码

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

谢谢!

【问题讨论】:

  • 如果我理解你的话,你问如何让代码更有效率?
  • 没错!我是 ctypes 和 dll 的初学者,所以我对此并不完全满意

标签: python c++ pointers dll ctypes


【解决方案1】:

如果您的问题是效率问题,那么您可能正在处理非常大的数据集。

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

另一个节省时间的解决方案是尽可能避免条件。如果你只在for循环里面有条件,编译器就能大大优化它。

如果没有看到更多代码,很难判断您的代码是否效率低下,或者只是为您的计算机处理了太多数据,但我给出的指导原则似乎与您给出的示例相符。

我最后要提到的是float 非常不精确,如果可能,您最好使用double

祝你好运

【讨论】:

  • 感谢您的帮助,我会尽量优化这种方式。
  • 还可以使用 numpy,它可以构建数组并将其传输到 ctypes,而无需在 for 循环中进行数据复制。
  • 我不知道这个,非常感谢。我会检查的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多