3

私は次のようなものを持っています:

d = {...} #a dictionary with strings
l1 = [...] #a list with stuff
l2 = [...] #a list with numbers

...

for i in l1:
    for key in l2:
        #do some stuff
        ...
        if d[key] == i:
            print d[key]

スレッドを使用して同じことをしたいと思います(パフォーマンス向上のため)。私は次のようなことを考えています:

import threading

d = {...} #a dictionary with strings
l1 = [...] #a list with stuff
l2 = [...] #a list with numbers

...

def test(i, key):
    #do the same stuff
    if d[key] == i:
        print d[j]

for i in l1:
    for key in l2:
        threading.start_new_thread(test, (i,key))

これが最善のアプローチであるかどうかはわかりません。私の最大の恐怖は、私がまったく最適化していないことです。いくつかの基本的なアイデアは次のとおりです。

  • d は共有メモリにある必要があります (すべてのスレッドからアクセスできます)。同じエントリにアクセスするスレッドはないと思います。
  • すべての (i, キー) の組み合わせを同時にテストする必要があります。

あなたの意見で、私が別の言語を使用する必要がある場合は、それを指摘していただければ幸いです. 助けていただければ幸いです。前もって感謝します。

4

2 に答える 2

0

test の戻り値が破棄されるため、2 番目のコードは何もしません。保持するつもりでしたprint d[j]か?

test(i, j)スレッドの起動は辞書へのアクセスよりも時間がかかるため、実際に複雑でない限り、何も最適化していないことは間違いありません。これでうまくいくかもしれません:

def test(i):
    for j in l2:
        if d[j] == i:
            print d[j]

for i in l1:
    threading.start_new_thread(test, (i,))

一般に、少数のスレッドでパフォーマンスを向上させることができますが、数百のスレッドではオーバーヘッドが増えるだけです。

グローバル インタープリター ロックは、Python でパフォーマンスを向上させるためにスレッド化を必ずしも役に立たなくするわけではありません。多くの標準ライブラリ関数は、重い作業を行っている間、グローバル インタープリター ロックを解放します。この単純な例では、おそらく並列処理はありません。

于 2013-06-08T22:44:41.310 に答える