Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.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/149.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++_Arrays - Fatal编程技术网

Python 使用C++;和蟒蛇

Python 使用C++;和蟒蛇,python,c++,arrays,Python,C++,Arrays,我正在模拟一个由大约100000颗恒星组成的小星系。我想在Python中做的可视化表示,C++中的大计算。使用CyType,我能够从Python调用C++函数。p> 我基本上想要的是一个数组,它在RAM中,可以用Python和C++访问。然后在Python调用函数UpDeDeO()时,C++更新数组。C++只改变数组中的值是很重要的。一直复制它会变得相当耗时 我是一个初学者,特别是C++,所以我真的不知道在哪里找到正确的信息,以及使用什么关键词。当然,我们欢迎您考虑如何做,但也非常感谢您提供一些

我正在模拟一个由大约100000颗恒星组成的小星系。我想在Python中做的可视化表示,C++中的大计算。使用CyType,我能够从Python调用C++函数。p> <>我基本上想要的是一个数组,它在RAM中,可以用Python和C++访问。然后在Python调用函数UpDeDeO()时,C++更新数组。C++只改变数组中的值是很重要的。一直复制它会变得相当耗时

我是一个初学者,特别是C++,所以我真的不知道在哪里找到正确的信息,以及使用什么关键词。当然,我们欢迎您考虑如何做,但也非常感谢您提供一些信息链接


最好,

< p>可以使用Python C/C++ API构建C++ Python包装模块:

< P>我将使用Python API创建一个C++模块(<代码> DATAUPDATER < /C>),让它调用,<代码>更新>代码>,它应该接收要加载数据的Python对象。 在Python端,每当我想从C加载数据时,我都会调用
dataUpdater.update
++

编辑:

其他选项是使C++模块的行为像数据结构提供数据访问服务,如:

  • getValueAt(索引)
  • setValueAt(索引)
  • getSize()
在python端使用它:

for i in xrange(dataUpdater.getSize()):
    val = dataUpdater.getValueAt(i)
    ...

可以使用Python C/C++ API构建:C++ Python包装模块:

< P>我将使用Python API创建一个C++模块(<代码> DATAUPDATER < /C>),让它调用,<代码>更新>代码>,它应该接收要加载数据的Python对象。 在Python端,每当我想从C加载数据时,我都会调用
dataUpdater.update
++

编辑:

其他选项是使C++模块的行为像数据结构提供数据访问服务,如:

  • getValueAt(索引)
  • setValueAt(索引)
  • getSize()
在python端使用它:

for i in xrange(dataUpdater.getSize()):
    val = dataUpdater.getValueAt(i)
    ...

总有这样的情况:


欢迎使用Boosi.Python的2版本,它是一个C++库,它允许C++和Python编程语言之间的无缝互操作。


欢迎使用Boosi.Python的2版本,它是一个C++库,它允许C++和Python编程语言之间的无缝互操作。

考虑到文档,您可以定义一个新类型;假设恒星是一个双精度阵列:

typedef struct {
    PyObject_HEAD
    double * Stars;
} Galaxy;
然后定义数学运算方法。。。(python文档)

在新定义的类型(Galaxy)中包含这些方法相当容易,您只需设置变量:

static PyMethodDef Galaxy_methods[] = 
{
    {"calc", (PyCFunction)Galaxy_calc, METH_VARARGS,"Performs stelar calculations."},
    {NULL}  /* Sentinel */
};


static PyMemberDef Galaxy_members[] = 
{    {"Stars", T_OBJECT_EX, offsetof(Galaxy, Galaxy), 0, "Galaxy Stars"},
    {NULL}  /* Sentinel */
};
现在只需将Galaxy_方法var包含在适当的位置下

static PyTypeObject Galaxy_GalaxyType = {
    PyObject_HEAD_INIT(NULL)
    0,                         /*ob_size*/
    "Galaxy.Galaxy ",           /*tp_name*/
    sizeof(Galaxy),            /*tp_basicsize*/
    0,                         /*tp_itemsize*/
    (destructor)Galaxy_dealloc, /*tp_dealloc*/
    0,                         /*tp_print*/
    0,                         /*tp_getattr*/
    0,                         /*tp_setattr*/
    0,                         /*tp_compare*/
    0,                         /*tp_repr*/
    0,                         /*tp_as_number*/
    0,                         /*tp_as_sequence*/
    0,                         /*tp_as_mapping*/
    0,                         /*tp_hash */
    0,                         /*tp_call*/
    0,                         /*tp_str*/
    0,                         /*tp_getattro*/
    0,                         /*tp_setattro*/
    0,                         /*tp_as_buffer*/
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,          /*tp_flags*/
    "Galaxy objects",          /* tp_doc */
    0,                         /* tp_traverse */
    0,                         /* tp_clear */
    0,                         /* tp_richcompare */
    0,                         /* tp_weaklistoffset */
    0,                         /* tp_iter */
    0,                         /* tp_iternext */
    Galaxy_methods,            /* tp_methods */
    Galaxy_members,            /* tp_members */
    0,                         /* tp_getset */
    0,                         /* tp_base */
    0,                         /* tp_dict */
    0,                         /* tp_descr_get */
    0,                         /* tp_descr_set */
    0,                         /* tp_dictoffset */
   (initproc)Galaxy_init,      /* tp_init */
    0,                         /* tp_alloc */
    Galaxy_new,                /* tp_new */
};

使用上面提到的python文档来实现新的、alloc、dealloc和init方法(这些方法非常简单),就完成了

您应该全面检查有关此问题的Python文档:

考虑到文档,您可以定义一个新类型;假设恒星是一个双精度阵列:

typedef struct {
    PyObject_HEAD
    double * Stars;
} Galaxy;
然后定义数学运算方法。。。(python文档)

在新定义的类型(Galaxy)中包含这些方法相当容易,您只需设置变量:

static PyMethodDef Galaxy_methods[] = 
{
    {"calc", (PyCFunction)Galaxy_calc, METH_VARARGS,"Performs stelar calculations."},
    {NULL}  /* Sentinel */
};


static PyMemberDef Galaxy_members[] = 
{    {"Stars", T_OBJECT_EX, offsetof(Galaxy, Galaxy), 0, "Galaxy Stars"},
    {NULL}  /* Sentinel */
};
现在只需将Galaxy_方法var包含在适当的位置下

static PyTypeObject Galaxy_GalaxyType = {
    PyObject_HEAD_INIT(NULL)
    0,                         /*ob_size*/
    "Galaxy.Galaxy ",           /*tp_name*/
    sizeof(Galaxy),            /*tp_basicsize*/
    0,                         /*tp_itemsize*/
    (destructor)Galaxy_dealloc, /*tp_dealloc*/
    0,                         /*tp_print*/
    0,                         /*tp_getattr*/
    0,                         /*tp_setattr*/
    0,                         /*tp_compare*/
    0,                         /*tp_repr*/
    0,                         /*tp_as_number*/
    0,                         /*tp_as_sequence*/
    0,                         /*tp_as_mapping*/
    0,                         /*tp_hash */
    0,                         /*tp_call*/
    0,                         /*tp_str*/
    0,                         /*tp_getattro*/
    0,                         /*tp_setattro*/
    0,                         /*tp_as_buffer*/
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,          /*tp_flags*/
    "Galaxy objects",          /* tp_doc */
    0,                         /* tp_traverse */
    0,                         /* tp_clear */
    0,                         /* tp_richcompare */
    0,                         /* tp_weaklistoffset */
    0,                         /* tp_iter */
    0,                         /* tp_iternext */
    Galaxy_methods,            /* tp_methods */
    Galaxy_members,            /* tp_members */
    0,                         /* tp_getset */
    0,                         /* tp_base */
    0,                         /* tp_dict */
    0,                         /* tp_descr_get */
    0,                         /* tp_descr_set */
    0,                         /* tp_dictoffset */
   (initproc)Galaxy_init,      /* tp_init */
    0,                         /* tp_alloc */
    Galaxy_new,                /* tp_new */
};

使用上面提到的python文档来实现新的、alloc、dealloc和init方法(这些方法非常简单),就完成了

正确地做到这一点实际上相当复杂。首先,你 对于Python中的数组,应该使用包
numpy
。然后 您可以定义一个C接口,如中所述 . (这是一本参考手册, 所以你可能想阅读,并尝试 首先)大多数 重要的是,您需要使用缓冲区接口 () 访问
numpy
数组

ctypes
似乎对连续数组也有一些支持 嗯,但我没有这方面的经验。如果你做任何处理 但是,在Python端的数组中,您需要使用
numpy
,我认为
ctypes
不支持它。

正确地执行此操作实际上相当复杂。首先,你 对于Python中的数组,应该使用包
numpy
。然后 您可以定义一个C接口,如中所述 . (这是一本参考手册, 所以你可能想阅读,并尝试 首先)大多数 重要的是,您需要使用缓冲区接口 () 访问
numpy
数组

ctypes
似乎对连续数组也有一些支持 嗯,但我没有这方面的经验。如果你做任何处理 但是,在Python端的数组中,您需要使用
numpy
,我认为
ctypes
不支持它。

下面是关于如何使用Boost.Python完成此任务的另一个建议

让我们将代码组织在3个文件中:a
setup.py
负责编译扩展代码,一个只使用扩展代码的Python脚本,以及扩展代码本身:

.
├── galaxy.cpp
├── main.py
└── setup.py
<> >代码> Galax.CPP:注意异常是不被处理的,所以你可以通过分配给未初始化的星和其他C++异常来产生分割错误。如果修改此代码,请注意始终将BOOST_PYTHON_模块命名为文件本身

#include <vector>

#include <boost/python.hpp>

class Star {
public:
    Star(double mass): mass(mass) {}

    bool set_mass(double given_mass) {
        this->mass = given_mass;
        return true;
    }
private:
    double mass;
};

class Galaxy {
public:
    Galaxy(const boost::python::list& masses) {
        for (size_t i = 0; i < len(masses); i++) {
            double mass = boost::python::extract<double>(masses[i]);
            stars.push_back(Star(mass));
        }
    }

    bool update(int star_number, double mass) {
        return this->stars[star_number].set_mass(mass);
    }

private:
    std::vector<Star> stars;
};

BOOST_PYTHON_MODULE(galaxy)
{
    using namespace boost::python;
    class_<Galaxy>("Galaxy", init< boost::python::list >())
        .def("update", &Galaxy::update)
    ;
}
最后,使用
Galaxy
对象在
main.py
中执行任何需要的操作。请注意,在本例中,对象是从Python列表构造的(这意味着您实际上在Python和C++之间至少传递了一次数组),但这不是必须的:您可以