Pybind11:在C ++函数中返回大型数组会显着增加python中的计算时间

问题描述

我写了一些C ++脚本,并使用pybind11使python中的C ++函数可用。从python调用时,C ++函数大约需要4秒钟才能终止。 C ++函数返回一个长度为54.346.383的大型数组。 出于好奇,我修改了C ++函数并返回了长度为7373的另一个数组,而未更改代码中的任何其他内容。现在,C ++函数将在1秒钟后终止。因此,据我了解,随着对象大小的增加,从C ++到Python的对象转移成为一个巨大的瓶颈。

是否有更聪明的方法解决此问题?也许使用指针? (我对C ++和pybind11完全陌生)

#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;

解决方法

它正在构造一个包含大量开销的Python浮点列表。我建议在Python端使用NumPy数组,其解释如下:returning numpy arrays via pybind11

这样,您可以分配一次数组内存,Python可以将其作为NumPy数组引用,而无需分配5400万个微小对象和对其的引用。