出于性能原因,我想将我的 python 程序的一部分移植到 C++,因此我尝试为我的程序编写一个简单的扩展。C++ 部分将构建一个字典,然后需要将其传递给 Python 程序。
我发现的一种方法似乎是在 C++ 中构建类似 dict 的对象,例如 a boost::unordered_map
,然后使用能够生成 Python dicts的Py_BuildValue
[1]方法将其转换为 Python。但是这种包括将容器转换为字符串表示并返回的方法似乎有点“迫在眉睫”,无法成为最高效的解决方案!?
所以我的问题是:在 C++ 中构建 Python 字典的最高效方法是什么?我看到 boost 有一个 Python 库,它支持 C++ 和 Python 之间的映射容器,但到目前为止我还没有在文档中找到我需要的确切内容。如果有这种方式,我宁愿直接在 C++ 中构建 Python dict,这样就不需要复制等。但是,如果最有效的方法是另一种方法,我也很擅长。
这是我编译成 .dll/.pyd 的(简化的)C++ 代码:
#include <iostream>
#include <string>
#include <Python.h>
#include "boost/unordered_map.hpp"
#include "boost/foreach.hpp"
extern "C"{
typedef boost::unordered_map<std::string, int> hashmap;
static PyObject*
_rint(PyObject* self, PyObject* args)
{
hashmap my_hashmap; // DO I NEED THIS?
my_hashmap["a"] = 1; // CAN I RATHER INSERT TO PYTHON DICT DIRECTLY??
BOOST_FOREACH(hashmap::value_type i, my_hashmap) {
// INSERT ELEMENT TO PYTHON DICT
}
// return PYTHON DICT
}
static PyMethodDef TestMethods[] = {
{"rint", _rint, METH_VARARGS, ""},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC
inittest(void)
{
Py_InitModule("test", TestMethods);
}
} // extern "C"
我想在 Python 中使用,例如:
import test
new_dict = test.rint()
字典会将字符串映射到整数。谢谢你的帮助!