NumPy
配列は、パフォーマンスと使いやすい(リストよりも簡単なスライシング、インデックス作成)の両方に最適です。構造化NumPy配列を高速化
dict
の代わりにNumPy structured array
のデータコンテナを構築しようとしました。NumPy arrays
です。問題はパフォーマンスがずっと悪いことです。同種のデータを使用すると約2.5倍、異種のデータは約32倍です(私はNumPy
のデータ型について話しています)。
構造化アレイのスピードを上げる方法はありますか?私はmemoryorderを 'c'から 'f'に変更しようとしましたが、これは何の影響もありませんでした。
ここに私のプロファイリングコードだ:
import time
import numpy as np
NP_SIZE = 100000
N_REP = 100
np_homo = np.zeros(NP_SIZE, dtype=[('a', np.double), ('b', np.double)], order='c')
np_hetro = np.zeros(NP_SIZE, dtype=[('a', np.double), ('b', np.int32)], order='c')
dict_homo = {'a': np.zeros(NP_SIZE), 'b': np.zeros(NP_SIZE)}
dict_hetro = {'a': np.zeros(NP_SIZE), 'b': np.zeros(NP_SIZE, np.int32)}
t0 = time.time()
for i in range(N_REP):
np_homo['a'] += i
t1 = time.time()
for i in range(N_REP):
np_hetro['a'] += i
t2 = time.time()
for i in range(N_REP):
dict_homo['a'] += i
t3 = time.time()
for i in range(N_REP):
dict_hetro['a'] += i
t4 = time.time()
print('Homogeneous Numpy struct array took {:.4f}s'.format(t1 - t0))
print('Hetoregeneous Numpy struct array took {:.4f}s'.format(t2 - t1))
print('Homogeneous Dict of numpy arrays took {:.4f}s'.format(t3 - t2))
print('Hetoregeneous Dict of numpy arrays took {:.4f}s'.format(t4 - t3))
編集:
Homogenious Numpy struct array took 0.0101s
Hetoregenious Numpy struct array took 0.1367s
Homogenious Dict of numpy arrays took 0.0042s
Hetoregenious Dict of numpy arrays took 0.0042s
EDIT2:私のタイミング番号を入れて忘れてしまった私は、TIMITモジュールといくつかの追加のテストケースを追加しました:
import numpy as np
import timeit
NP_SIZE = 1000000
def time(data, txt, n_rep=1000):
def intern():
data['a'] += 1
time = timeit.timeit(intern, number=n_rep)
print('{} {:.4f}'.format(txt, time))
np_homo = np.zeros(NP_SIZE, dtype=[('a', np.double), ('b', np.double)], order='c')
np_hetro = np.zeros(NP_SIZE, dtype=[('a', np.double), ('b', np.int32)], order='c')
dict_homo = {'a': np.zeros(NP_SIZE), 'b': np.zeros(NP_SIZE)}
dict_hetro = {'a': np.zeros(NP_SIZE), 'b': np.zeros(NP_SIZE, np.int32)}
time(np_homo, 'Homogeneous Numpy struct array')
time(np_hetro, 'Hetoregeneous Numpy struct array')
time(dict_homo, 'Homogeneous Dict of numpy arrays')
time(dict_hetro, 'Hetoregeneous Dict of numpy arrays')
の結果:
Homogeneous Numpy struct array 0.7989
Hetoregeneous Numpy struct array 13.5253
Homogeneous Dict of numpy arrays 0.3750
Hetoregeneous Dict of numpy arrays 0.3744
実行間の比率はかなり安定しているようです。両方のメソッドと異なるサイズの配列を使用します。
はoffcaseにとっては重要: のpython:3.4 numpyの:1.9.2
この質問は一般的な批判ではなく、NumPyの特定のパフォーマンス問題について質問しているので、コードレビューからスタックオーバーフローに移行されています。 –
構造化配列を実際に使いたい場合は、[pandas](http://pandas.pydata.org/)を試してみることをお勧めします。 –
この問題を参照してください:https://github.com/numpy/numpy/issues/6467 – MaxNoe