2016-07-11 47 views
0

我開始於Python中的線程,並嘗試實現合併排序,其中開始時作業被分解爲2個線程。我正在使用collections.deque,itertools.islice,threading.Thread排序似乎比2個線程慢1

我在開始時創建了兩個線程,他們通常每做一半工作,然後加入他們併合並結果。但是我注意到它比兩個線程的長度要長(幾乎是兩倍長),比我通常做的要多

這怎麼可能? 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++不同,由於GIL的原因,Python很難並行化。

雖然collections.dequeappendpopleft是線程安全的,但這並不能保證它們在非串行範例中表現良好。

它與這個問題有關嗎?

不.GIL是CPython的財產。這與虛假分享完全脫節。

與兩個線程相比,它通常會花費更長的時間(幾乎是2倍長)。

這是因爲GIL不支持共享內存多線程。因此,你基本上是連續運行你的代碼兩次

+0

所以你的意思是我不能只用多線程就能使這個速度更快?我能做什麼 ? – BusyAnt

+1

@BusyAnt我不推薦Python用於多線程應用程序。優先選擇C++,Java,Scala或其他任何東西。 – erip

+0

好的,我會記住的。你能說這裏有什麼東西在吃我的程序嗎?線程創建?在線程之間切換?還有別的嗎?我不確定我在這裏完全理解了...... – BusyAnt