这现在可能没有实际意义,我在你的另一个问题上发布了类似的内容,但我已经为 Python 3.3 和 C++ 而不是 Python 2.7 和 C 调整了这个版本。
如果您想取回一个 Python 列表对象,并且由于您正在构建一个可能很长(200,000 个项目)的列表,那么在 C++ 代码中构建 Python 列表可能更有效,而不是构建一个std::vector
然后稍后将其转换为 Python 列表。
根据您其他问题中的代码,我建议使用类似的东西......
// foo.cpp
#include <python3.3/Python.h>
#include <fstream>
#include <string>
using namespace std;
extern "C"
{
PyObject* foo(const char* FILE_NAME)
{
string line;
ifstream myfile(FILE_NAME);
PyObject* result = PyList_New(0);
while (getline(myfile, line))
{
PyList_Append(result, PyLong_FromLong(1));
}
return result;
}
}
...编译...
$ g++ -fPIC -shared -o foo.so foo.cpp -lpython3.3m
...以及使用示例...
>>> from ctypes import *
>>> foo = CDLL('./foo.so')
>>> foo.foo.restype = py_object
>>> foo.foo(b'foo.cpp')
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
...尽管如果您需要将现有列表转换std::vector
为 Python 列表,您可以通过将向量的长度传递给 来预先分配 Python 列表所需的内存PyList_New()
,然后使用PyList_SetItem()
而不是PyList_Append()
.
我能想到的唯一其他方法是......
要在 Python 中预先分配一块 RAM,并让 C++ 函数填写值,就像在 qarma 的回答中一样,但是您必须事先知道要分配多少 RAM。您可以选择一个任意值,但鉴于事先不知道文件中的行数,这个数字可能太大或太小。
在 C++ 中进行堆分配std::vector
,并返回指向第一个元素的指针和元素的数量,但是一旦你完成了它,你就必须编写第二个函数来释放 RAM。
无论哪种方式,您仍然需要将“返回”数组转换为 Python 列表的开销,因此您不妨自己动手。