私が取り組んでいるアルゴリズムの処理速度を改善しようとしています。マルチプロセッシングプールとマップを使用してすべてのCPUコアで作業負荷を効率的に分散しようとする前に、可能であればこのループをベクトル化したいと考えています。どのようにnumpyでベクトル化することができますが、+(2x for)のネストループですか?
ここに例を示します。
v = [1,2,3,4,5,6,7,8,9,10]
w = [-3,-2,-1,0,1,2,3]
u = sorted(w, reverse=True)
i = 0
check = 0
while v[i] != v[-1]:
if check == 0:
for k in range(len(w)):
if (v[i] < w[k] & v[i+1] >= w[k]) or (v[i] > w[k] & v[i+1] <= w[k]):
do_somthing()
check = 1
break
i = i+1
if check == 1:
for k in range(len(u)):
if (v[i] <= u[k] & v[i-1] > u[k]) or (v[i] >= u[k] & v[i-1] < u[k]):
do_something_else()
check = 0
break
i = i+1
この例の配列値は完全にランダムです。 Vには少なくとも2000個の要素が含まれ、wのサイズは常に固定されます。
'u'と' w'が鏡像になるように 'w'ソートされていますか? –
はい、wは最低値 - >最高値にソートされています。 – ilpomo
これを 'ndarray''v'と' w'引数を受け入れる関数にしてみませんか?次に、関数を 'numba.jit'でコンパイルします。ネイティブのCPythonデータ型に依存しないようにできる特別なループ演算では、numba.jitはほとんど常に最適ですが、ベクトル化されたnumpyバージョンよりも一般に高速ですが、可読性があり、難読化されたベクトル操作を必要としない方法です。 – ely