gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:11:47 24 4
gpt4 key购买 nike

我的应用程序生成了大量 (>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/

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