2016-07-11 4 views
0

のPythonのスレッドではじまり、最初はジョブが2つのスレッドに分割されるマージソートを実装しようとしています。私はcollections.deque,itertools.islice,threading.Threadを使用しています。並べ替えは1の代わりに2つのスレッドで遅くなるようです

私は最初に2つのスレッドを作成し、通常はジョブの半分ずつ行います。その後、それらを結合して結果をマージします。しかし、は、2つのスレッドで通常より長く(約2倍の長さ)なります。通常はです。

どうすれば可能ですか? Here is a link to the code、必要であれば、私はここでの主な部分を再現することができます(私もCode Review SEにその質問を投稿し、私はむしろ短いこれを維持するだろう)

それはthis質問にリンクされている(Cで同様の問題のようです++)?どうもありがとうございました。

+1

シリアルよりも遅い[pythonマルチスレッドの可能な複製]?(http://stackoverflow.com/questions/10789042/python-multi-threading-slower-than-serial) –

+0

なぜdownvoteですか? – BusyAnt

+2

CPythonのGILはマルチスレッドを制限しますが、あなたは 'multiprocessing'を使用することができます。 –

答えて

1

どうすれば可能ですか?

C++とは異なり、PythonはGILのために並列化が非常に困難です。

collections.dequeappendpopleftはスレッドセーフですが、これが非シリアルパラダイムでうまく動作することを保証するものではありません。

この質問にリンクしていますか?

いいえ.GILはCPythonのプロパティです。それは誤った共有から完全に切り離されています。

2つのスレッドで通常よりも時間がかかります(ほぼ2倍)。

これは、GILが共有メモリのマルチスレッドをサポートしていないためです。そのため、本質的にコードを連続して実行しています2回

+0

マルチスレッドだけでこれを高速化することはできないのですか?私は何ができますか? – BusyAnt

+1

@BusyAnt私はマルチスレッドアプリケーションのためにPythonを推奨しません。 C++、Java、Scala、またはその他のほとんどのものを優先します。 – erip

+0

私はそれを覚えています。私のプログラムのパフォーマンスをここで食べていることは言うことができますか?スレッドの作成?スレッド間の切り替え?他に何か?私はここで完全に理解しているかどうかはわかりません。 – BusyAnt

関連する問題