pybind11 以某种方式减慢了 C++ 函数

pybind11 somehow slows c++ function

我见过的所有 Whosebug/github 问题都是关于在编组对象的情况下加快来自 Python 的函数调用。 但我的问题是关于 pybind11 C++ 模块函数中纯 c++ 函数的工作时间。

我有加载数据集并从本机 C++ 库调用训练方法的训练函数 class:

void runSvm() 
    // read smvlight file into required sparse representation
    auto problem = read_problem( "random4000x20.train.svml" );

    CSvmBinaryClassifierBuilder::CParams params( CSvmKernel::KT_Linear );
    params.Degree = 3;
    params.Gamma = 1/20;
    params.Coeff0 = 0;

    // measure time here
    using namespace std::chrono;
    system_clock::time_point startTime = high_resolution_clock::now();

    CSvmBinaryClassifierBuilder( params ).Train( *problem ); // measure time only for this line

    nanoseconds delay = duration_cast<nanoseconds>( high_resolution_clock::now() - startTime );
    std::cout << setprecision(3) << delay / 1e6 << std::endl;
}

我通过 pybind11 将这个函数绑定到 Python:

PYBIND11_MODULE(PythonWrapper, m) {
    m.def( "runSvm", &runSvm );
}

然后编译pybind11模块库并从Python调用它。计时器值超过 3000 毫秒。 但是当我从纯 C++ 调用此函数时,计时器值约为 800 毫秒。 当然,我期待一些开销,但不是在这个地方,也不是那么多。

我 运行 它在一个线程中,两种情况下它 100% 加载一个核心。

问题出在哪里?谁遇到了同样的问题,你是如何处理的?

当我在处理一个可重现的例子时,我发现我在 C++ 例子(它基于 libsvm 参数证明 'rbf')和 pybind11 lib(它是硬编码的 'linear').修复它并比较相同的算法后,时间没有差异。