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

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

我发现的一种方法似乎是在C++中构建类似dict的对象,例如boost::unordered_map,然后使用Py_BuildValue [1]方法将其转换为Python,该方法能够生成Python字典。但是这种将容器转换为字符串表示形式并返回的方法似乎在“指日可待”方面显得太多了,以至于不是最有效的解决方案!

所以我的问题是:在C++中构建Python字典的最有效方法是什么? 我看到boost拥有一个Python库,该库支持C++和Python之间的映射容器,但是到目前为止,我在文档中没有找到我需要的确切东西。如果有这种方法,我希望直接在C++中构建一个Python字典,这样就不需要复制等了。但是,如果最有效的方式是另一种方式,那么我也很满意。

这是我编译成.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()
    为(...){
    PyDict_SetItem(d,key,val);
    }
    返回d;

  • 或通过重写__setitem____getitem__编写模仿dict的python对象。在这两种方法中,请使用原始的哈希图。最后,将不会发生任何复制!
  • 在Java中,执行“ ++++++++”表达式,编译器未报告任何错误并且可以正确执行? - java

    我用eclipse编写了这段代码,用war写过,结果为3d。public static void main(String[] args) { double a = 5d + + + + + +-+3d; System.out.println(a); } 参考方案 您的表情可以改写为(5d) + (+ + + + +-+3d) 其中第一个+是应用于两个操作数的…

    在Python和C++之间传输数据而无需写入Windows和Unix文件 - python

    我有预先存在的python和C ++文件,其中python文件定义了许多点,而C ++代码利用其现有库进行了所需的计算。最终产品是C ++代码写入的文件。我正在寻找一种在python中获取2000点列表的方法,将其传递给函数,然后执行所有C ++代码并输出我需要的文件。其他注意事项。这必须是可以在Linux或Windows机器上工作的东西,并且最少安装新插件…

    扩展Python时可以使用C++功能吗? - c++

    Python手册说您可以在C和C++中为Python创建模块。使用C++时可以利用类和模板之类的东西吗?它不会与其他库和解释器产生不兼容吗? 参考方案 挂钩函数的实现是用C还是用C++实现都没有关系。实际上,我已经看过一些Python扩展,这些扩展有效利用C++模板甚至Boost库。没问题。 :-)

    将Python嵌入C++应用程序 - c++

    上下文:我们一直面临的一个持续问题是对我们的市场数据应用程序进行单元测试。这些应用程序坐下来观察从提要中检索到的数据并执行某些操作。一些很难触发的关键事件很少发生,并且测试人员很难在所有情况下验证我们的应用程序是否正常运行,因此我们必须依靠单元测试。这些系统通常通过在事件发生时发出回调(进入我们的应用程序)来工作,然后由我们负责处理此事件。 我设想的解决方案…

    如何用Cython保持C++类名不变? - c++

    我有一个名为Foo的C++类。如果遵循Cython C++ tutorial,则需要以其他方式调用Python类,例如PyFoo。但是我确实也需要调用Python类Foo。如何有效地做到这一点?编辑:我正在尝试接口以前与Boost Python接口的现有C++库。由于不同的原因,我想测试Cython。由于使用Boost:Python调用了Python类,因此…