これはおそらく今は意味がなく、他の質問にも似たようなものを投稿しましたが、このバージョンを Python 2.7 と C ではなく Python 3.3 と 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]
...ただし、既存の を Python リストに変換する必要がある場合は、ベクトルの長さを に渡し、代わりに を使用するstd::vector
ことで、Python リストに必要なメモリを事前に割り当てることができます。PyList_New()
PyList_SetItem()
PyList_Append()
私が考えることができる唯一の他の方法は...
Python で RAM のブロックを事前に割り当て、C++ 関数に値を入力させるには、qarma の回答のように、割り当てる RAM の量を事前に知っておく必要があります。任意の値を選択することもできますが、ファイル内の行数が事前にわからない場合、この数は大きすぎるか小さすぎる可能性があります。
C++ でヒープを割り当て、std::vector
最初の要素へのポインターと要素の数を返すには、2 つ目の関数を記述して RAM を解放する必要があります。
いずれにせよ、「返された」配列を Python リストに変換するオーバーヘッドがまだ残っているため、自分で行うこともできます。