用C++和Python访问数组

2024-07-03 08:12:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在研究一个由大约10万颗恒星组成的小星系的模拟。我想在Python中做的可视化表示,C++中的大计算。使用CyType,我能够从Python调用C++函数。在

<>我基本上想要的是一个数组,它在RAM中,可以用Python和C++访问。然后在Python调用函数UpDeDeO()时,C++更新数组。C++只改变数组中的值是很重要的。一直复制它会很费时。在

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

最好的


Tags: 函数信息链接可视化数组关键词ram调用函数
3条回答

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

https://docs.python.org/2/extending/extending.html

< P>我将使用Python API创建一个C++模块(^ {CD1>}),提供一个服务,让它调用,^ {CD2>},它应该接收要加载数据的Python对象。在

在您的Python端,每当我想从C++中加载数据时,我会调用^ {CD3>}

编辑:

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

  • getValueAt(index)
  • setValueAt(index)
  • getSize()

在python端使用它:

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

正确地做这件事实际上是相当复杂的。首先,你 {cd1>包中的Python}应该使用。然后, 您可以定义一个C接口,如中所述 https://docs.python.org/2/c-api/。(这是一本参考手册, 所以你可能想要阅读,并尝试 https://docs.python.org/2/extending/index.html第一)最多 重要的是,您需要使用缓冲区接口 (https://docs.python.org/2/c-api/buffer.html#bufferobjects) 访问numpy数组。在

ctypes似乎对连续数组有一定的支持 嗯,但我没有经验。如果你做任何处理 但是,对于Python端的数组,您需要使用 numpy,我不认为{}会支持它。在

关于这个问题,您应该完全查阅Python文档:

https://docs.python.org/2/extending/

考虑到doc,您可以定义一个新类型;假设恒星是一个双精度数组:

typedef struct {
    PyObject_HEAD
    double * Stars;
} Galaxy;

然后定义数学运算方法。。。(python文档)

^{pr2}$

在新定义的类型(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文档来实现new、alloc、dealoc和init方法(这些方法非常简单),就完成了!在

相关问题 更多 >