将 **float array 从 C++ Dll 传递给 python
Passing **float array from C++ Dll to python
由于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
。
祝你好运
相关文章:
- Python ctypes:不会按预期加载 dll
- 将 **float array 从 C++ Dll 传递给 python
- 如何在python中加载C # / C++ dll?
- 尝试使用来自python的dll
- Boost.Python 和导入 dll,"The specified module could not be found"
- 在python-ctypes中声明变量并传递给dll函数
- C++ 使用 SWIG 和 Visual Studio 2017 在 python 中导入 DLL
- Calling C++ dll from python
- 是否有可能让 c++ dll 在后台运行 python 程序并让它填充向量图?如果是这样,如何?
- 提升 Python 找不到 dll 文件
- 在 DLL 中嵌入 Python:Py_DECREF列表对象时访问冲突读取位置
- 从 Python 调用 Windows DLL 函数时出错
- 尝试在 python 中正确加载和使用 dll 文件
- Windows错误:异常:使用从C++到Python的ctypes创建DLL时出现访问冲突或Windows错误193
- 当嵌入python numpy时,延迟负载python dll
- C DLL中的Python对象
- 为什么 Python 需要 DLL 中的 GetMessage 消息泵送,而不是 Qt
- 在编译像Pillow之类的图书馆时,如何更改Python dll的名称
- 在哪里可以获得Visual Studio的Python DLL
- 编译时跳过Boost.Python dll