调用boost::python::call的更智能方式
Smarter way of calling boost::python::call?
我已经编写了一个小类方法,它通过boost::python
从C++调用python函数,并且我已经观察到纯python的速度有了很好的改进:
namespace bp = boost::python;
double pyf::eval(double * const x) const
{
bp::list lx;
for (size_t i = 0; i < this->get_n(); i++)
lx.append(x[i]);
return bp::call<double>(pycb_, lx);
}
pycb_
是我的PyObject*
回调函数。
我的问题是:你知道从double *
指针创建boost::python::list
的更聪明的方法吗?我目前的解决方案很虚,但我发现boost::python
文档很难理解,而且缺乏具体的示例,所以欢迎您的经验!
仅供参考,我使用的是相对较旧的Boost版本(1.41)。此外,我的包的其余部分依赖于boost
,我更喜欢使用boost::python
,避免添加第三方pkg。
据我所知,迭代是从该类型的源代码填充Boost.Python list
的唯一方法。删除部分样板代码的替代迭代解决方案包括使用Boost.ForEach或std::for_each
算法。
例如,以下两个片段等效于原始代码:
double pyf::eval(double * const x) const
{
bp::list lx;
BOOST_FOREACH(double& value, boost::make_iterator_range(x, x + this->get_n()))
lx.append(value);
return bp::call<double>(pycb_, lx);
}
和
double pyf::eval(double * const x) const
{
bp::list lx;
std::for_each(x, x + this->get_n(),
boost::bind(&bp::list::append<double>, &lx, _1));
return bp::call<double>(pycb_, lx);
}
下面是一个嵌入式Python的基本示例,展示了这两种方法:
#include <algorithm>
#include <iostream>
#include <boost/array.hpp>
#include <boost/bind.hpp>
#include <boost/foreach.hpp>
#include <boost/range/iterator_range.hpp>
#include <boost/python.hpp>
int main()
{
Py_Initialize();
namespace python = boost::python;
try
{
python::object main = python::import("__main__");
// Add the verbose_sum function to main.
python::exec(
"def verbose_sum(x):n"
" print xn"
" return sum(x)n"
"n", main.attr("__dict__"));
// Mockup data.
PyObject* callback = python::object(main.attr("verbose_sum")).ptr();
boost::array<double, 5> x_array = {{ 1, 2, 3, 4, 5 }};
double* const x = &x_array[0];
const std::size_t n = x_array.size();
// Range iterator.
{
python::list x_list;
BOOST_FOREACH(double& value, boost::make_iterator_range(x, x + n))
x_list.append(value);
std::cout << python::call<double>(callback, x_list) << std::endl;
}
// Algorithm with binding.
{
python::list x_list;
std::for_each(x, x + n,
boost::bind(&python::list::append<double>, &x_list, _1));
std::cout << python::call<double>(callback, x_list) << std::endl;
}
}
catch (python::error_already_set&)
{
PyErr_Print();
}
}
输出:
[1.0, 2.0, 3.0, 4.0, 5.0]
15
[1.0, 2.0, 3.0, 4.0, 5.0]
15
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 如何在c++中为模板函数实例创建快捷方式
- 优先顺序:智能指针和类析构函数
- 在c代码之间共享数据的最佳方式
- 在C++中将函数压缩为两种方式
- 以螺旋方式打印矩阵的程序.(工作不好)
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 创建引用向量的优雅方式
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 智能指针作为无序映射键,并通过引用进行比较
- 不同/较旧的处理器运行c++代码的方式是否不同
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 为什么智能指针不能用通常的指针方式声明
- 如何计算排队多少个字?更智能的方式
- 如何在不同的目标平台上以编程方式智能注册 32 位 COM/DLL 组件
- 调用boost::python::call的更智能方式
- 实现此switch语句的更智能的方式
- 如何使用pthreads以智能的方式向线程共享变量