コードを最適化しようとすると、最後のリソースは複数のコアを使って以下のコードを実行しようとするようです。私はコードを変換/再構成する方法を正確には知らないので、複数のコアを使って実行するほうがはるかに高速です。最終目標を達成するための指導を受けることができれば幸いです。最終的な目標は、各配列が約70万の要素を保持する配列AとBに対して、このコードをできるだけ高速に実行できることです。ここでは小さな配列を使用したコードです。 700k要素配列はコメントアウトされています。MATLABの "ismember"関数に相当するPython
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.
私は何をしようとしていると、MATLAB関数のようにフォーマットされ[2](1 ismemberと呼ばれる模倣することである:[Lia,Locb] = ismember(A,B)
私はちょうどLocb
一部のみを取得しようとしています
。 MATLABから:AはBのメンバー主の
ものではないどこLocbは、出力アレイ、Locbは、0が含まれているBのメンバーである各値に対してBの最下位インデックスを含みます問題は私がablになる必要があるということですeこの操作を可能な限り効率的に実行する。テストのために、私は700k要素の2つの配列を持っています。ジェネレータを作成してジェネレータの値を調べても、そのジョブを速く完了させることはできません。
これは本当に速いです!あなたは私があなたの解決策にどのくらい感謝しているか分かりません。どうもありがとうございました !特定のツールを使用してパフォーマンスプロファイルを出力しますか? – zd5151
@ z5151いいえ、それは簡単なアルゴリズム分析です。 [Big-O表記法を使う](http://en.wikipedia.org/wiki/Big_O_notation): 'np.where'は、' O(len(B)) 'を必要とする' B'の線形スキャンを実行しなければなりません。オペレーション。 'O(len(A))'操作を必要とする外部ループを使用して、元のアルゴリズムをおおよそ 'O(len(A)* len(B))'操作にします。 'Bind'を生成するには' len(B) '操作が必要です。辞書は[ハッシュテーブル](http://en.wikipedia.org/wiki/Hash_table)として実装されており、一定の 'O(1)'ルックアップを持ち、スキャンAは 'O(len(A))'です。全体の複雑さは 'O(len(A)+ len(B))'です。 – sfstewman
入手しました。ウィキペディアの参考に感謝します。 – zd5151