使用cython

时间:2016-04-27 19:54:18

标签: python c++ cython

我正在尝试使用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)'   对象

这里有什么问题?

提前感谢您的帮助。

1 个答案:

答案 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数组。