python的一个最大的问题就是for循环太慢,有时候对于多维变量必须要用for循环尤其是多重for循环的时候,还得向C++寻求帮助。
这里主要介绍如何在python中调用C++
在python中调用C++最好的办法是cython,这个方法比较成熟。特点是最大程度保留了python的书写方式和C++的运算速度。
调用cython的方法很简单,一般装了jupyter的系统里就自带cython了。
调用方式一般是:
这里把关键代码展示一下:
就是这么简单,直接在jupyter里引用就行了。cython后面的关键词-a是用来显示Yellow lines的,也就是代码中可以优化的地方(python与c++交互频繁的地方)。
——————————————————————————————————————
接下来谈谈如何调用其他c++库,这里以gsl库为例。
gsl库是C++里做数学运算的重要库。C++里专门做科学运算的库比较少,gsl是比较好的一个。
安装方法:
Ubuntu:
sudo apt-get install libgsl-dev
安装完成之后,写一个代码验证:
example.c
#include #include
int main (void)
{
gsl_matrix* myMatr = gsl_matrix_alloc(10,20);
// matrix of 8sfor (int i=0; i < 10; i++)
for (int j=0; j < 20; j++)
gsl_matrix_set(myMatr, i, j, 8);
gsl_matrix_free(myMatr);
printf("Hello\n");
return 0;
}
然后编译、链接测试程序:
gcc example.c -lgsl -lgslcblas -lm
上面的-lgsl -lgslcblas -lm是gsl需要的库,来源在这里:Using the Library
运行结果如下图所示:
这就说明gsl在本地装好了。
——————————————————————————————————————
接下来在cython里调用gsl:
就这样extern一下就行了。当然,记得cython后面要接上-lgsl -lgslcblas -lm,那是gsl必须的库。
——————————————————————————————————————
进阶:如果要调用的gsl里复杂一些的函数,就要注意python object和C++数据类型的转换:
这里如果直接将proll[i,j,:]带入gsl_stats_correlation函数计算,会报错,显示不能把python object转换成const double。我的解决方法是用上图中两个框来自定义gsl_stats_correlation函数所需的input结构,然后给这个input结构赋值。对于单个数对数的赋值cython是已经很好的解决了的。
另外,第一个框中用malloc是为了定义动态数组。这也是c++中比较不同于python的麻烦之处。