2017-09-21 4 views
-1

ちょうど2つのネストされたループがPythonで非常に遅いことが分かりました。 CPU負荷は約0%のままですが、それでも速度は遅くなります。どうして?どうすれば修正できますか?ネストされたループの動作が遅すぎる

初期化(それは、高速動作させるために、それをコメントするべきではありません):

a = imresize(image, (maxY, maxX), 'lanczos') 
    b = imresize(image, (maxY * 2, maxX), 'lanczos') 

スローコード:

result = np.empty((maxY, maxX, 3), dtype=np.uint16) 
    for y in range(maxY): 
     for x in range(maxX): 
      result[y, x] = [a[y, x], a[y, x], a[y, x]] 

そして、この1つは、より遅く動作します:

result = np.empty((maxY, maxX, 3), dtype=np.uint16) 
    for y in range(maxY): 
     for x in range(maxX): 
      result[y, x] = [a[y, x], b[y*2, x], b[y*2+1, x]] 

同じ結果を達成するための他のより効果的なコードはありますか?

aの形状は(299,29)、b-(598,299)、結果 - (299,29,3)である。私はコードを約5000回呼び出す(そして、その量のデータについては約10分待つ)。

私が提供したコードにコメントすると、すべてがちょうど2番目にとなります。

+1

1)アルゴリズムを修正する、2)numpyを使用する、3)CPythonを使用するすべてのオプションです。より多くの情報がなければ、何も言うのは難しい –

+1

これらの変数やCPU負荷評価に関する情報はありません。 – sascha

+1

常に、*常に*、**常に** NumPyは、配列。 – o11c

答えて

1

コードを修正するためにベクトル化を使用してください。そのような :

result[:,:,0] = a 
+0

いいアイデア!しかし、私はまだそれと1つのループを使用する必要があります。 – Dmitry

1

割り当てメモリは、常にすべての言語では遅いので、あなたはそれを回避する必要があります。あなたの例では、すべてのループにlistを作成します。

あなたは、次のようなものを使用する必要があります

result = np.empty((maxY, maxX, 3), dtype=np.uint16) 
for i in range(3): 
    result[:, :, i] = a 

キーポイントは、メモリの割り当てを動的避けるためです:

result = np.empty((maxY, maxX, 3), dtype=np.uint16) 
for y in range(maxY): 
    for x in range(maxX): 
     result[y, x, 0] = a[y, x] 
     result[y, x, 1] = a[y, x] 
     result[y, x, 2] = a[y, x] 

や@ user3237718で述べたように、あなたが使用する必要があります

+0

すでにコードの最初のバージョンを自分で試してみました。それはほんの少しだけ助けになりました。 – Dmitry

+0

@ドミトリーもう1つお試しください。 – Sraw

関連する問題