2011-06-10 49 views
2

我想知道:在嘗試在Python中創建並行算法會有什麼優點嗎?假設我想研究一種新的並行算法,並且我可以選擇C,C#和Python,其中一個或另一個是「更好」的來測試和測試這些算法,或者它們只是「功能上等價」,除與解釋/編譯/虛擬語言相關的常量,它們都將是相同的?謝謝Python,Java,C#和並行算法

+0

對我來說,平行和Erlang一起去吃麪包和黃油。 Jus'說'。:-) – 2011-06-10 02:57:54

+0

:)好吧,也許是時候檢查Erlang了,但我想知道是否它選擇研究這種算法的語言。 – 2011-06-10 02:59:18

回答

4

由於全局解釋器鎖定(GIL),Python不適用於此,因此它不能以此方式工作。 C很難在多線程環境中使用,但有一種替代方案 - Cilk語言。 C#是並行編程的不錯選擇。您可以使用.NET Framework 4中的任務並行庫,併發數據結構和PLINQ。

+0

Python在其'multiprocessing'模塊中具有很好的並行處理工具:http://docs.python.org/library/multiprocessing.html - 說它不合適是誤導。 – FogleBird 2011-06-13 15:01:05

0

C有許多選擇,但它是低級語言。英特爾的線程構建模塊是基於Cilk的商業並行庫,我聽說它很好。

這取決於你想爲Python做什麼。雖然您可以通過使用Cython(一種預編譯的Python變體)來避開GIL,但Cython編譯速度慢並且失去平臺獨立性。另外,Python是一種腳本語言,因此您通常希望在並行化之前切換爲更快的語言。也就是說,使用Python中的multiprocessing模塊(可以避開GIL),你可以編寫一些簡單的並行代碼。

Java可能是你最好的選擇。​​關鍵字以及體面的原語(例如線程安全的非阻塞隊列)使它相對愉快。 Java雖然老了,所以你浪費時間編寫比Python更詳細的代碼。

我在Haskell中慢慢地(漸進地)學習並行。獲得有效運行似乎並不是最容易的事情,但如果你的任務非常平行,那麼它似乎運作良好。而且,當然,Haskell具有令人難以置信的表達力(在你完成它後,它在語法上完全不同 - 因爲imho的理由不同),並且由於它的功能性,你不會得到奇怪的狀態腐敗問題。最糟糕的情況是你的代碼不能縮放。像STM(軟件事務存儲器)這樣的庫有很多種,它們似乎比(比如鎖)更強大的(理論上)解決某些問題比命令式程序員使用的基元更好。

0

我會明確地使用Python,因爲編寫Python程序既快速又簡單,而且它可能已經包含了您需要的所有工具。它將允許您專注於算法,而不是處理語法和聲明。

對於基準測試,您可以使用cProfiletimeit模塊。

你想測試什麼樣的並行算法?並行編程有很多種方法。對於需要擴展到很多進程的算法,最簡單的方法可能是使用MPImpi4py是一個非常好的Python實現,並且與numpy緊密集成,如果您需要處理數組數組。

如前所述,multithreading只能使用1個處理器,因爲GIL。但是這個限制只適用於這種情況。您可以在所需的多個處理器上使用multiprocessing

最後,在Python中有用於functional programming的工具。並且coroutines可以很適合併發編程。