我目前正在处理通过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
谢谢!
如果您的问题是效率,那么您可能正在处理非常非常大的数据集。
使二维矩阵迭代速度更快的最简单方法是使其成为一维矩阵。 如果您有X列和Y行,那么您可以访问矩阵[I][j]
,而不是访问矩阵[I*X+j]
,这将为您节省一次取消引用,并可能节省许多缓存未命中。 如果可能,您甚至可以更进一步,将矩阵视为一维数组。
另一个节省时间的解决方案是尽量避免条件。 如果您只在for-loop内部有条件,编译器将能够极大地优化它。
在没有看到更多代码的情况下,很难判断您的代码是否效率低下,或者只是简单地为计算机处理了太多数据,但我给出的指导原则似乎与您给出的示例相符。
我要提到的最后一点是float
非常不精确,如果可能,最好使用double
。
祝你好运