提问者:小点点

将**浮点数组从C++Dll传递到python


我目前正在处理通过Dll和CTypes导入到python中的C/C++函数。 在DLL中,我有一个函数以一个浮点**变量作为参数。 这个参数填充在函数中,我在python上使用cTypes得到它。

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

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

下面是我的代码:

导出函数的短版本(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

谢谢!


共1个答案

匿名用户

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

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

另一个节省时间的解决方案是尽量避免条件。 如果您只在for-loop内部有条件,编译器将能够极大地优化它。

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

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

祝你好运

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(浮点|数组|c++dll|传递|python)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?