c++ - 高效使用python对象迭代大量数据调用python函数

标签 c++ python

我的应用程序生成了大量 (>4gb) 数据,我需要对它进行迭代,对每个数据元素调用 python 函数。

我的数据将被分解成“行”,我将定义几个引用这些数据的 python 变量(对象)。理想情况下,这些对象将采用原生形式,即我的数据将具有 double 、整数和 char 数组等,即

struct DataRow
{
    char key[ 32 ];
    double value;
    int source;
};
DataRow *rows = new DataRow[ 40000000 ];

我已经阅读了一些关于 PyBuffer 对象的内容,它可以“包装”一个内存区域,我假设我能够构造其中的 3 个来“指向”数据的第一行(关键, value, source),然后构造一个元组并在我之前准备的代码对象上调用 PyObject_CallObject()。

PyObject *keyBuffer = PyBuffer_FromMemory( rows[ 0 ].key, 32 );
PyObject *valueBuffer = PyBuffer_FromMemory( &rows[ 0 ].value, sizeof( double ) );
PyObject *sourceBuffer = PyBuffer_FromMemory( &rows[ 0 ].source, sizeof( int ) );

但是,这种方法似乎存在几个问题..

  1. 如何将 PyBuffer 对象持有的指针前进到指向下一行。
  2. 我如何取消 double 和整数缓冲区以在 python 脚本中使用它们的值

我确信这一定是可能的。如果不是,那么考虑到我必须构建的 PyObject 数量,在所有行中使用 python 脚本可能太慢了。

最佳答案

如果要对数据进行任何操作,都免不了要创建大量的python对象。 chars、double 和 int 需要分别成为不可变的 PyString、PyFloat 和 PyInt 对象。

既然您已经在编写 C,您不妨创建一个返回一系列键/值/源元组的迭代器。

这种方法的优点在于,只要不保留对这些对象的引用,您就可以在连续调用之间重用这些对象。这可以使您免于为每个对象分配和释放。有关如何执行此操作的示例,请参阅位于 http://hg.python.org/cpython/file/2.7/Modules/itertoolsmodule.c#l3541 的 itertools.izip 的源代码.我相信这种方法可以毫不费力地为您提供所需的效率(只需破解 izip 代码即可满足您的需求)。

关于c++ - 高效使用python对象迭代大量数据调用python函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9482336/

相关文章:

c++ - 当我在Emacs中执行 'compile'命令时,如何自动给出当前缓冲区的文件名?

c++ - 并发 C++11 - 可以使用哪些工具链?

c++ - 如何在 C++11 中初始化未在其构造函数中初始化其所有成员的类

Python 字典 : changing the order of nesting

c++ - glm::vec3 精度 C++

c++ - 使用 std::enable_if<> 的模板特化

python - 填充 Pandas 系列中缺失的日期

python - 使用 Flask 格式化电话号码以进行演示和数据库输入

python - Keras:处理自定义 PIL 逊相关指标的批量大小维度

python - Wagtail - 以编程方式编辑现有页面