Pybind11:返回C+中的大数组+;函数显著增加了python中的计算时间 我编写了一个C++脚本,使用pybDun11来实现Python中的C++函数。当从Python调用时,C++函数需要大约4秒才能终止。C++函数返回长度为54.34×38的大数组。 出于好奇,我修改了C++函数,并返回了一个长度为7373的不同数组,而不改变代码中的任何其他内容。现在C++函数以1秒结束。因此,当我理解到,对象从C++到Python的传输成为一个巨大的瓶颈,因为对象的大小增加了。

Pybind11:返回C+中的大数组+;函数显著增加了python中的计算时间 我编写了一个C++脚本,使用pybDun11来实现Python中的C++函数。当从Python调用时,C++函数需要大约4秒才能终止。C++函数返回长度为54.34×38的大数组。 出于好奇,我修改了C++函数,并返回了一个长度为7373的不同数组,而不改变代码中的任何其他内容。现在C++函数以1秒结束。因此,当我理解到,对象从C++到Python的传输成为一个巨大的瓶颈,因为对象的大小增加了。,python,c++,pybind11,Python,C++,Pybind11,有没有更聪明的方法来处理这个问题?也许和指针一起工作?(我对C++和PybDin 11完全陌生) #包括 #包括 #包括 #包括 #包括 名称空间py=pybind11; std::vector isoCdf_seq(std::vector array_w,std::vector w,std::vector Y,std::vector posY,std::vector array_Y){ std::载体CDF; CDF.准备金(m*mY); //一些代码 返回CDF; 它正在构建一个具有大量开销

有没有更聪明的方法来处理这个问题?也许和指针一起工作?(我对C++和PybDin 11完全陌生)

#包括
#包括
#包括
#包括
#包括
名称空间py=pybind11;
std::vector isoCdf_seq(std::vector array_w,std::vector w,std::vector Y,std::vector posY,std::vector array_Y){
std::载体CDF;
CDF.准备金(m*mY);
//一些代码
返回CDF;

它正在构建一个具有大量开销的Python浮点列表。我建议在Python端使用NumPy数组,如下所述:


通过这种方式,您可以一次性分配数组内存,Python可以将其作为NumPy数组引用,而无需分配5400万个微小对象和对它们的引用。

它正在构建一个具有大量开销的Python浮点列表。我建议在Python端使用NumPy数组,如下所述:


这样,你可以分配一次数组内存,Python可以将它作为一个麻木数组引用,而不分配5400万个小对象和引用。

完美和一个快速的后续问题:当用Python中的NUMPY数组作为C++函数输入时,另一种方法又如何呢?这也会导致大量的开销吗?例如,传输C连续的NUMPY数组而不是普通的NUMPY数组更快(在C++中,然后使用STD::MMECPY)将NP数组转换成C++对象:EVVA:您应该尝试将Python数组从Python传递到C++,然后直接访问它的内存,将其拷贝(或者复制到向量中,同样的事情)。如果你真的需要一个拷贝,无论C++是否接收到完整的NoPy对象数组、Python缓冲区或MyMyVIEW视图,或者是指向数据加上大小的指针,任何避免将其序列化为新存储格式的东西都会有帮助。但是,没有什么比序列化到Python列表慢了。另一方面,当使用Python中的NUMPY数组作为C++中的函数输入时,这也会导致大量开销吗?例如,传输C连续的NUMPY数组而不是常规的NUMPY数组是否更快?(在C++中,然后使用STD:MEMCPY将NP数组转换成C++对象)@ EVVA:你应该尝试把Python数组从Python传递到C++,然后直接访问它的内存,将它拷贝(或者复制到向量中,同样的东西)。只有当你真的需要一个拷贝。C++是否接收到数组作为完整的NUMPY对象、Python缓冲区或MyMyVIEW,或者指向数据加上大小的指针,任何避免将其序列化为新的存储格式的方法都会有所帮助。但是,没有什么比序列化到Python列表慢了。
#include <pybind11/pybind11.h>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include <vector>
#include <numeric>

namespace py = pybind11;

std::vector<double> isoCdf_seq(std::vector<double> array_w, std::vector<double> W, std::vector<double>  Y, std::vector<int>  posY, std::vector<double>  array_y) {

std::vector<double> CDF;
CDF.reserve(m * mY);

// some code

return CDF;