gpt4 book ai didi

c++ - 如何在 C++ 中高效地构建 Python 字典

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:57 26 4
gpt4 key购买 nike

出于性能原因,我想将部分 python 程序移植到 C++,因此我尝试为我的程序编写一个简单的扩展。 C++ 部分将构建一个字典,然后需要将其传递给 Python 程序。

我发现的一种方法似乎是用 C++ 构建类似 dict 的对象,例如boost::unordered_map,然后使用 Py_BuildValue 将其转换为 Python [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()

字典会将字符串映射为整数。感谢您的帮助!

最佳答案

  • 直接使用 CPython API 是:
    PyObject *d = PyDict_New()    for (...) {      PyDict_SetItem(d, key, val);    }    return d;
  • 或者通过覆盖 __setitem____getitem__ 编写一个模拟字典的 python 对象。在这两种方法中,都使用您的原始 HashMap 。最后,不会发生复制!

关于c++ - 如何在 C++ 中高效地构建 Python 字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8434754/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com