Python 优化--cython/numba/pypy/cppyy/pybind11

CPPYY--即时利用c++代码 生成python扩展模块(一)

2019-08-24  本文已影响0人  北方的花姑娘

CPPYY

cppyy 非常灵活易用,可以将c/c++代码封装成python可以直接调用的模块,在这中间,用户不需要任何额外的代码

pip install cppyy

以下代码在jupyter/ipython中运行:

import cppyy
# 直接在ipython中写c++代码,cppyy会自动编译成python可以调用的模块,on-the-fly compilation
# 生成的模块接口和c++中定义的是一致的

cppyy.cppdef("""
std::vector<double> vec_dot(const std::vector<double> &vec1, const std::vector<double> &vec2){
    std::vector<double> ret;
    if (vec1.size() != vec2.size()) return ret;
    int size = vec1.size();
    for (int i=0;i<size;i++){
        ret.push_back(vec1[i] * vec2[i]);
    }
    return ret;
}
""")
True
# 使用上面定义的vec_dot

# cppyy.gbl 是global 命名空间,即时生成模块都在这里
vec_dot = cppyy.gbl.vec_dot
# vec_dot 使用了 std::vector 为入口和出口参数
Vector = cppyy.gbl.std.vector
# Vector[typename]()  Vector 是一个模板类,需要传入tpyenae,但是python中使用[] 而不是<>
vec1 = Vector[float]([1.0, 2.0, 3.0, 4.0])
vec2 = Vector[float]([1.0, 3.0, 2.0, 4.0])
vec1, vec2
(<cppyy.gbl.std.vector<float> object at 0x000001E120E8ECF0>,
 <cppyy.gbl.std.vector<float> object at 0x000001E120E8FA70>)
# 可以转换成list,看到数据
list(vec1), list(vec2)
([1.0, 2.0, 3.0, 4.0], [1.0, 3.0, 2.0, 4.0])
# 调用c++函数vec_dot
vec_ret = vec_dot(vec1, vec2)
list(vec_ret)
[1.0, 6.0, 6.0, 16.0]

总结


参考:

  1. cppyy docs
  2. cppyy tutorials
  3. 性能比较
上一篇 下一篇

猜你喜欢

热点阅读