繁体   English   中英

使用cython将c ++函数暴露给python

[英]Exposing a c++ function to python using 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,double,int,int,int,const vector [double]&,double)'转换为Python对象

这有什么问题?

在此先感谢您的帮助。

你必须先告诉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时都py_util ,因此可能有点慢。 如果util存储了以后使用的引用(可能不太可能,但总是可能的话!),这也是一个问题,因为到那时p_vec将不复存在。

另外两个选项是创建一个包装vector[double]的Cython类。 这对你来说显然更有用,但是在每次调用py_util时都要避免类型转换。 或者,您可以修改util因此它使用double* ,并在Python端使用numpy数组或python数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM