Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在C++;_Python_C++_Object_Cython - Fatal编程技术网

Python 在C++;

Python 在C++;,python,c++,object,cython,Python,C++,Object,Cython,我正在编写一个代码,使用区间分析的方法计算非线性贴图的图像,应用minkowski和,并重复任意次数的迭代 我在Python中编写了一个工作代码,但是我希望能够在C++中实现更多的迭代/递归密集部分,以提高速度。过去我使用Cython有很好的效果,但是我想练习我的C++。 也,我的对象足够复杂,我宁愿避免在C++中实现它们(婴儿步骤)。 因此,我的问题是: 1)在C++中使用Python对象是否有效率的提高? 2)如果不是,可以使用Cython来包装一个在Python对象上迭代/递归的C++

我正在编写一个代码,使用区间分析的方法计算非线性贴图的图像,应用minkowski和,并重复任意次数的迭代

我在Python中编写了一个工作代码,但是我希望能够在C++中实现更多的迭代/递归密集部分,以提高速度。过去我使用Cython有很好的效果,但是我想练习我的C++。 <>也,我的对象足够复杂,我宁愿避免在C++中实现它们(婴儿步骤)。 因此,我的问题是:

1)在C++中使用Python对象是否有效率的提高?

2)如果不是,可以使用Cython来包装一个在Python对象上迭代/递归的C++函数吗?


更具体地说,我有一个递归算法,它在BST的左右两个孩子上重复(虽然它是一个相当大的修改BST,所以我不想陷入在C++中实现它的细节),但是运行时非常令人讨厌,所以我想用C++来写。

< P>是的。您将获得纯Python的加速,但与使用纯<代码> C/C++ +/Cuff>时的增加不相称。如果你想处理Python对象,你需要通过;这增加了执行的开销,这是允许您与Python交互所必须付出的代价

请注意,这涉及到很多复杂性,因为您需要熟悉API并了解函数对对象引用的作用、如何创建列表、打包元组等等。如果您只需创建几个将方法包装到对象上的
public
Cython
cdef
函数,就可以跳过所有这些。这将生成所有为您处理这些问题的
CPython
代码

一个包装并嵌入愚蠢对象的小示例可能如下所示(注意,我使用的是
.c
c++
有类似的步骤):

使用
cython pycls.pyx
(对于
c++
,使用
-cplus
)编译将生成一个
.c
.h
文件,分别包含源声明和函数声明。现在只需创建一个启动Python的
main.c
文件,即可调用以下函数:

#include "Python.h"   // Python.h always gets included first.
#include "pycls.h"    // Include your header file.

int main(int argc, char *argv[])
{
    Py_Initialize();   // initialize Python
    PyInit_pycls();    // initialize module (initpycls(); in Py2)
    PyObject *obj = createPyClass();
    for(int i=0; i<10; i++){
        addData(obj, i);
    }
    printf("%s\n", printCls(obj));
    Py_Finalize();
    return 0;
}
将创建与对象交互的可执行文件:

./a.out
Data: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
所有这些都是通过使用
Cython
以及生成
.h
头文件的
public
关键字来完成的。您也可以使用Cython编译一个python模块,然后自己创建附加样板文件的头/句柄。因为我认为你不想陷入
C-API
学习的泥潭,所以这不应该是一条路


正如@freakish在他的评论中所说的,提取数据()并用纯
C++
处理它将是非常理想的。通常,如果您在
C/C++
中运行循环并在那里执行繁重的工作,您将获得很好的速度提升 Python < /C>中实现数据结构,并实现对DS进行算法>代码> C++ +/>代码>。对吗?@Jim,就是这个意思:)谢谢你。我同意,学习API的努力可能不值得我花时间。提取数据似乎是个好主意。昨晚我决定,我要尝试改写我的课在C++中,如果我认真致力于学习语言。如果碰巧我无法管理它,我将研究数据提取。
gcc pycls.c main.c -L$(python3.5-config --cflags) -I$(python3.5-config --ldflags) -std=c99
./a.out
Data: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]