私は、配列モジュールを使用して、符号なし32ビット整数のかなりの数(多くのギガバイト)を格納しています。各要素に4バイトを使用するのではなく、pythonはarray.itemsizeで示されるように8バイトを使用し、pymplerで検証します。Pythonの配列要素を特定のサイズにすることはできますか?
例:
>>> array("L", range(10)).itemsize
8
私は、要素の数が多いので、私は4つのバイト内でそれらを保存するの恩恵を受けるだろう。
numpyのは、私は符号なしの32ビットのint型として値を格納できるようになる:
>>> np.array(range(10), dtype = np.uint32).itemsize
4
しかし、問題はnumpyののインデックス演算子を使用して、任意の操作があるということである約2倍遅い、ベクトル演算ではありません操作はサポートさそうnumpy分遅いです。 は、例えば:
python3 -m timeit -s "import numpy as np; a = np.array(range(1000), dtype = np.uint32)" "for i in range(len(a)): a[i]"
10000 loops, best of 3: 90.4 usec per loop
対
python3 -m timeit -s "from array import array; a = array('L', range(1000))" "for i in range(len(a)): a[i]"
10000 loops, best of 3: 51.4 usec per loop
だから私はに強制的にどちらか私は希望、またはプログラムは、私が希望の倍遅く実行されますの2倍のメモリを使用しています。これを回避する方法はありますか?私はPython配列を指定されたitemsizeを使用するよう強制できますか?
https://bugs.python.org/issue26821 –
これは間違った二分法です。プログラムのメモリ使用量が少なくて済み、高速です。異なるプラットフォーム上で固定サイズの 'array'アイテムを使うことができるかどうかという疑問とは無関係ですが(' array'はおそらくプラットフォーム固有のCタイプサイズを使用しています)。これは分離された質問です。具体的なnumpyベースの計算をより速くする方法です。 – jfs