我正在尝试使用cython将c ++函数公开给python,如下所示:
from libcpp.vector cimport vector
cdef extern from "auction.h":
cpdef double util(
int q,
int sq,
double alpha,
double beta,
double kappa,
int s,
int ss,
int m,
const vector[double]& p,
double a0);
我收到以下(不是非常具有描述性)的错误:
src \ RFQLib.pyx:4:21:无法转换'double(int,int,double,double, Python的double,int,int,int,const vector [double]&,double)' 对象
这里有什么问题?
提前感谢您的帮助。
答案 0 :(得分:0)
你必须先告诉Cython这个函数(通过cdef exetern from
机制),然后创建一个调用它的Cython函数,你可以在Python中使用它:
from libcpp.vector cimport vector
cdef extern from "auction.h":
double util(
int q,
int sq,
double alpha,
double beta,
double kappa,
int s,
int ss,
int m,
const vector[double]& p,
double a0);
def py_util(int q,
int sq,
double alpha,
double beta,
double kappa,
int s,
int ss,
int m,
p,
double a0):
cdef vector[double] p_vec = p
return util(q,sq,alpha,beta,kappa,s,ss,m,p_vec,a0)
轻微的复杂性是转换为C ++ vector<double>
。 Cython可以自动将包含适当类型的列表/元组转换为向量。另一方面,每次调用py_util
时都会这样做,因此可能有点慢。如果util
存储了以后使用的引用(可能不太可能,但总是可能的话!),这也是一个问题,因为那时p_vec
将不复存在。
另外两个选项是创建一个包装vector[double]
的Cython类。这显然对您有用,但避免每次调用py_util
时进行类型转换。或者,您可以修改util
,以便它使用double*
,并在Python端使用numpy数组或python数组。