コードの最適化を何度も試みた結果、最後のリソースは、複数のコアを使用して以下のコードを実行することであると思われます。複数のコアを使用してより高速に実行できるように、コードを変換/再構築する方法が正確にはわかりません。最終目標を達成するためのガイダンスを得ることができれば幸いです。最終的な目標は、各配列が約 700,000 要素を保持する配列 A および B に対して、このコードをできるだけ速く実行できるようにすることです。これは、小さな配列を使用したコードです。700k 要素の配列はコメントアウトされています。
import numpy as np
def ismember(a,b):
for i in a:
index = np.where(b==i)[0]
if index.size == 0:
yield 0
else:
yield index
def f(A, gen_obj):
my_array = np.arange(len(A))
for i in my_array:
my_array[i] = gen_obj.next()
return my_array
#A = np.arange(700000)
#B = np.arange(700000)
A = np.array([3,4,4,3,6])
B = np.array([2,5,2,6,3])
gen_obj = ismember(A,B)
f(A, gen_obj)
print 'done'
# if we print f(A, gen_obj) the output will be: [4 0 0 4 3]
# notice that the output array needs to be kept the same size as array A.
私がやろうとしているのは、ismember [2] と呼ばれる MATLAB 関数を模倣することです (次のようにフォーマットされているもの: 。部分のみ[Lia,Locb] = ismember(A,B)
を取得しようとしています。Locb
Matlab から: Locb には、B のメンバーである A の各値の B の最小インデックスが含まれます。出力配列 Locb には、A が B のメンバーでない場合は常に 0 が含まれます。
主な問題の 1 つは、この操作をできるだけ効率的に実行できるようにする必要があることです。テストのために、700k 要素の 2 つの配列があります。ジェネレーターを作成し、ジェネレーターの値を調べても、仕事が速く完了しないようです。