复制C+的最佳方式+;Python缓冲区 < P>使用Python处理C扩展时,从C++数组或“代码>矢量< /代码>中移动数据到 pyObjs >代码> pyList< /Cord>是什么最好的方法,所以它可以返回到Python?
我现在使用的方法似乎有点笨拙。我循环遍历每个元素并调用复制C+的最佳方式+;Python缓冲区 < P>使用Python处理C扩展时,从C++数组或“代码>矢量< /代码>中移动数据到 pyObjs >代码> pyList< /Cord>是什么最好的方法,所以它可以返回到Python?,python,c++,c,Python,C++,C,我现在使用的方法似乎有点笨拙。我循环遍历每个元素并调用Py\u BuildValue将值附加到PyList 是否有类似于memcpy?在将每个元素添加到序列之前,必须从每个元素构造一个PyObject 因此,您必须逐个添加它们,或者将它们全部转换,然后从PyObject[]传递给构造函数 我想第二种方法速度稍快,因为它不必在每次添加后调整序列的成员变量。在将每个元素添加到序列之前,必须从每个元素构造一个PyObject 因此,您必须逐个添加它们,或者将它们全部转换,然后从PyObject[]传递
Py\u BuildValue
将值附加到PyList
是否有类似于
memcpy
?在将每个元素添加到序列之前,必须从每个元素构造一个PyObject
因此,您必须逐个添加它们,或者将它们全部转换,然后从PyObject[]
传递给构造函数
我想第二种方法速度稍快,因为它不必在每次添加后调整序列的成员变量。在将每个元素添加到序列之前,必须从每个元素构造一个
PyObject
因此,您必须逐个添加它们,或者将它们全部转换,然后从PyObject[]
传递给构造函数
我想第二种方法速度稍快,因为它不必在每次添加后调整序列的成员变量。在将每个元素添加到序列之前,必须从每个元素构造一个
PyObject
因此,您必须逐个添加它们,或者将它们全部转换,然后从PyObject[]
传递给构造函数
我想第二种方法速度稍快,因为它不必在每次添加后调整序列的成员变量。在将每个元素添加到序列之前,必须从每个元素构造一个
PyObject
因此,您必须逐个添加它们,或者将它们全部转换,然后从PyObject[]
传递给构造函数
我想第二种方法速度稍快,因为它不必在每次添加后调整序列的成员变量。如果可以将Boost作为依赖项安装,那么可以利用
Boost::python::list
类自动进行转换。要将std::vector
转换为python::list
如果可以将Boost作为依赖项安装,则可以利用Boost::python::list
类自动进行转换。要将std::vector
转换为python::list
如果可以将Boost作为依赖项安装,则可以利用Boost::python::list
类自动进行转换。要将std::vector
转换为python::list
如果可以将Boost作为依赖项安装,则可以利用Boost::python::list
类自动进行转换。要将std::vector
转换为python::list
如果向量包含同质数字数据,最好创建一个将值传输到python的函数
与列表不同,数组在内部将其值存储为本机C值的连续数组,但在其他方面提供类似python列表的接口。它最大限度地减少了内存占用,使您能够实际使用单个memcpy
调用来高效地传输数据。以下是一个例子:
PyObject *
vec_to_array(std::vector<double>& vec)
{
static PyObject *single_array;
if (!single_array) {
PyObject *array_module = PyImport_ImportModule("array");
if (!array_module)
return NULL;
PyObject *array_type = PyObject_GetAttrString(array_module, "array");
Py_DECREF(array_module);
if (!array_type)
return NULL;
// array.array('d', [0.0])
single_array = PyObject_CallFunction(array_type, "c[d]", 'd', 0.0);
Py_DECREF(array_type);
if (!single_array)
return NULL;
}
// extra-fast way to create an empty array of count elements:
// array = single_element_array * count
PyObject *pysize = PyLong_FromSsize_t(vec.size());
if (!pysize)
return NULL;
PyObject *array = PyNumber_Multiply(single_array, pysize);
Py_DECREF(pysize);
if (!array)
return NULL;
// now, obtain the address of the array's buffer
PyObject *buffer_info = PyObject_CallMethod(array, "buffer_info", "");
if (!buffer_info) {
Py_DECREF(array);
return NULL;
}
PyObject *pyaddr = PyTuple_GetItem(buffer_info, 0);
void *addr = PyLong_AsVoidPtr(pyaddr);
// and, finally, copy the data.
if (vec.size())
memcpy(addr, &vec[0], vec.size() * sizeof(double));
return array;
}
PyObject*
向量到向量阵列(标准::向量和向量)
{
静态PyObject*单_数组;
如果(!单_数组){
PyObject*array_module=PyImport_ImportModule(“数组”);
if(!数组_模块)
返回NULL;
PyObject*array_type=PyObject_GetAttrString(数组模块,“数组”);
Py_DECREF(阵列_模块);
如果(!数组类型)
返回NULL;
//array.array('d',[0.0])
单个数组=PyObject调用函数(数组类型,“c[d]”,'d',0.0);
Py_DECREF(数组类型);
如果(!单_数组)
返回NULL;
}
//创建计数元素空数组的超快速方法:
//数组=单个元素数组*计数
PyObject*pysize=PyLong_fromsize_t(vec.size());
如果(!pysize)
返回NULL;
PyObject*数组=PyNumber\u乘法(单数组,pysize);
Py_DECREF(pysize);
if(!数组)
返回NULL;
//现在,获取数组缓冲区的地址
PyObject*buffer_info=PyObject_CallMethod(数组,“buffer_info”,“”);
如果(!缓冲区信息){
Py_DECREF(数组);
返回NULL;
}
PyObject*pyaddr=PyTuple\u GetItem(buffer\u info,0);
void*addr=PyLong_AsVoidPtr(pyaddr);
//最后,复制数据。
if(向量大小())
memcpy(addr,&vec[0],vec.size()*sizeof(double));
返回数组;
}
读者可以通过模板专门化来增强这一点,以支持其他基本类型。如果向量包含同质数字数据,那么最好创建一个将值传输到Python的模板 与列表不同,数组在内部将其值存储为本机C值的连续数组,但在其他方面提供类似python列表的接口。它最大限度地减少了内存占用,使您能够实际使用单个
memcpy
调用来高效地传输数据。以下是一个例子:
PyObject *
vec_to_array(std::vector<double>& vec)
{
static PyObject *single_array;
if (!single_array) {
PyObject *array_module = PyImport_ImportModule("array");
if (!array_module)
return NULL;
PyObject *array_type = PyObject_GetAttrString(array_module, "array");
Py_DECREF(array_module);
if (!array_type)
return NULL;
// array.array('d', [0.0])
single_array = PyObject_CallFunction(array_type, "c[d]", 'd', 0.0);
Py_DECREF(array_type);
if (!single_array)
return NULL;
}
// extra-fast way to create an empty array of count elements:
// array = single_element_array * count
PyObject *pysize = PyLong_FromSsize_t(vec.size());
if (!pysize)
return NULL;
PyObject *array = PyNumber_Multiply(single_array, pysize);
Py_DECREF(pysize);
if (!array)
return NULL;
// now, obtain the address of the array's buffer
PyObject *buffer_info = PyObject_CallMethod(array, "buffer_info", "");
if (!buffer_info) {
Py_DECREF(array);
return NULL;
}
PyObject *pyaddr = PyTuple_GetItem(buffer_info, 0);
void *addr = PyLong_AsVoidPtr(pyaddr);
// and, finally, copy the data.
if (vec.size())
memcpy(addr, &vec[0], vec.size() * sizeof(double));
return array;
}
PyObject*
向量到向量阵列(标准::向量和向量)
{
静态PyObject*单_数组;
如果(!单_数组){
PyObject*array_module=PyImport_ImportModule(“数组”);
if(!数组_模块)
返回NULL;
PyObject*array_type=PyObject_GetAttrString(数组模块,“数组”);
Py_DECREF(阵列_模块);
如果(!数组类型)
返回NULL;
//array.array('d',[0.0])
单个数组=PyObject调用函数(数组类型,“c[d]”,'d',0.0);
Py_DECREF(数组类型);
如果(!单_数组)
返回NULL;
}
//创建计数元素空数组的超快速方法:
//数组=单个元素数组*计数
PyObject