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').修复它并比较相同的算法后,时间没有差异。
我见过的所有 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').修复它并比较相同的算法后,时间没有差异。