使用ctypes通过指针args调用C ++函数

时间:2019-01-01 15:48:18

标签: python c++ numpy ctypes

某些背景(可能与问题不直接相关):我需要执行已知稀疏度的有效矩阵乘法。
因为它很稀疏,所以使用普通矩阵乘法是很浪费的,并且由于它是已知的稀疏性,因此我可以以有效的方式实现它,而不是使用稀疏库。

我已经用C ++实现了功能

get

这是“包装器”:

void SparsePrecisionMult(double *Q, double *X, double *out, const int dim, const int markov, const int n);

这就是我的称呼:

import ctypes
_SPMlib = ctypes.CDLL('./SparsePrecisionMult.so')
_SPMlib.SparsePrecisionMult.argtypes = (ctypes.POINTER(ctypes.c_double), ctypes.POINTER(ctypes.c_double), ctypes.POINTER(ctypes.c_double),
                                        ctypes.c_int, ctypes.c_int, ctypes.c_int)

def sparse_precision_mult(Q, X, out, markov_blanket_size):
    global _SPM
    m, d = X.shape
    _SPMlib.SparsePrecisionMult(Q.ctypes.data_as(ctypes.POINTER(ctypes.c_double)),
                                X.T.ctypes.data_as(ctypes.POINTER(ctypes.c_double)),
                                out.ctypes.data_as(ctypes.POINTER(ctypes.c_double)),
                                d, markov_blanket_size, m)

此测试应导致out = X。
用C编写的测试版本效果很好。
我出去= 0。所以我的猜测是,内存不以某种方式不被共享和复制。
我不想在RAM上重复数据(此函数将用于高维矩阵)。那我该怎么解决呢?

谢谢。

1 个答案:

答案 0 :(得分:1)

self.items[indexPath.row].quantity += 1 创建数组的副本。因此,astype参数给out.astype(np.float64)提供了一个副本,该副本被修改然后丢弃。原始sparse_precision_mult未被修改。

创建类型为out的{​​{1}},并在函数调用后(如有必要)进行转换。

如果可能的话,应首先创建函数调用所需类型的所有参数,以免被out复制。

np.float64具有参数astype,可以将其设置为astype以避免不必要的副本,但是与依赖于副本相比,最好确保/不需要副本