我对Cython C ++编译感到困惑。 我有一个用C ++实现的算法,我要么用C ++调用它,要么用python调用Cython包装器。 代码的包装部分花费的时间可以忽略不计, 但如果我不使用Cython,算法的运行速度要快10倍。
Cython的运行时间与没有优化的C ++时间非常相似。
我按照这样编译我的程序:
setup(ext_modules = cythonize(Extension(
"max_depth_cpp",
sources=["cpp/wrap.pyx", "cpp/count_inliers.cpp",
"cpp/max_depth.cpp", "cpp/misc.cpp", "cpp/solver.cpp",
"cpp/vec3.cpp" , "cpp/wrapper.cpp"],
language="c++",
extra_compile_args=["-O3","-std=c++17"],
extra_link_args = ["-std=c++17"]
)))
删除-O3选项不会改变运行时间。
wrap.pyx
导入numpy为np
cimport numpy as np#for np.ndarray
np.import_array()#verk important(seg faults)
cdef extern: void wrapper(double *,double *,int,double,double *)
cpdef max_depth_cpp(np_v1, np_v2, eps):
cdef np.ndarray[double, ndim=2, mode='c'] v1 = np_v1
cdef np.ndarray[double, ndim=2, mode='c'] v2 = np_v2
cdef np.ndarray[double, ndim=1, mode='c'] t
t = np.zeros(3, dtype=np.double)
wrapper(&v1[0,0], &v2[0,0], len(v1), eps, &t[0])
return t
wrapper.cpp
#include "wrapper.h"
#include "solver.h"
void wrapper(double* v1_in, double* v2_in, int N, double eps, double* t){
solver(v1_in, v2_in, N, eps, t); //changes t
}
Solver只是调用我的C ++方法调用。它首先从numpy数组中获取所有数据,但这只花费了很少的总时间