2016-09-16 15 views
0

配列の標準データ型としてnumpy配列を使用するPythonプログラムを使用しています。重い計算のために、私は配列をC++ライブラリに渡します。そうするために、私はpybindを使用します。しかし、私はPython listを使用する必要があります。pythonのnumpy tolist()はどのくらいのオーバーヘッドを追加しますか?

NativeSolver.vector_add(array1.tolist(), array2.tolist(), ...) 

この変換がどの程度のオーバーヘッドが発生しない:私は経由numpyアレイとlistからの変換を行いますか?私はそれが全く新しいコピーを作成しないことを願っています。 numpyの参照は言う:

ndarray.tolist()

リターン(ネスト)Pythonのリストとして配列データのコピー。データアイテム は、最も近い互換性のあるPythonタイプに変換されます。

+0

「pybind」githubとドキュメントでバッファプロトコルとnumpyの参照が見つかりました。 – hpaulj

答えて

3

たくさん。単純なビルトイン型の場合、オブジェクトにはsys.getsizeofを使用して、そのオブジェクトに関連付けられたメモリオーバーヘッドを判断できます(コンテナの場合は、格納されている値は格納されず、格納に使用されたポインタのみが含まれます)。

したがって、たとえば、100小さめint秒のlist(ただし、256より大きいが小さいintキャッシュを回避するためには)(私の3.5.1のWindows x64でインストール)です:

>>> sys.getsizeof([0] * 100) + sys.getsizeof(0) * 100 
3264 

または約3キロバイトメモリが必要です。これらの値がnumpyarrayint32に格納されていて、オブジェクトポインタごとにPythonオブジェクトが1つもなくても、オブジェクトのオーバーヘッド自体がarrayの場合、およそ100 * 4(さらに数十バイト) 、500バイト以下のどこか。追加の小額のそれぞれの増分コストは、オブジェクトの場合は24バイトです(ただし、-5〜256 IIRCの値の場合は小intキャッシュの場合は無料です)。list、合計32バイトのストレージの場合は8バイトです。 .4 Cレベルのタイプの場合は4、ストレージ要件の約8倍です(元のオブジェクトも保存しています)。

あなたがそれに対処するための十分なメモリを持っているなら、それもそうです。しかし、そうでなければ、バッファプロトコルをサポートしているオブジェクト(Pythonではnumpy.arrayarray.array、メモリビュースライスの割り当てなどによって配列が埋め込まれた​​など)を渡すことができるラッピングを見てみると、Pythonレベルの型への変換は不要です。

3

はい、新しいコピーになります。配列のデータレイアウトはリストのデータレイアウトと大きく異なります。

配列には、形状とストライドのような属性と、要素を含む1dデータバッファー(連続したバイトセット)があります。これは、浮動小数点数、int、文字列、1d、2dなどとして扱う他の属性とコードです。

リストは、メモリ内の他のオブジェクトを指すポインタを持つポインタのバッファです。数値、文字列、または別のリストを指すことがあります。配列のデータバッファまたはその中の要素を指すことはありません。

配列データバッファを使用するコンパイル済みコードとC配列を持つインターフェイスnumpy配列があります。 cythonは共通です。 numpyのためのC APIに関する文書全体のセクションもあります。私はpbindについて何か知っています。リストインターフェイスが必要な場合は、それが最適ではない可能性があります。

timeitのテストを行ったところ、それほど高価にはなりませんでした。

=======================

しかし、私はnumpyへの参照の数を見つけるpybind11 githubのを見て、この

http://pybind11.readthedocs.io/en/latest/advanced.html#numpy-support

ドキュメントページ。これは、バッファプロトコルとnumpy配列をサポートしています。だから、tolistのステップを経る必要はありません。

#include <pybind11/numpy.h> 
void f(py::array_t<double> array); 
+0

私はそれについて知っています。私はいくつかのpybind11データ型のSTLデータ型をあきらめたくありません。私は今SWIGを使って巻いた。私の見解では、SWIGはPythonとC++ファイルを可能な限りそのままにすることができる唯一のラッパーです。 –

関連する問題