2011-10-24 56 views
1

我有一個蒙特卡洛模擬器,它有一個計算函數,它在一個循環中調用許多(數百萬或更多)次。爲了加速這一點,我想分成多個並行的線程調用模擬器。即。如果我想要一個總共運行100萬次的話,可以將它分成4到25萬次並行運行。每個線程使用相同的變量名稱,我該如何處理這個問題,以避免衝突?我是否必須用不同的命名變量創建4個獨立版本的模擬器?在Python中使用並行產卵函數處理變量

我已經開始使用Python線程模塊編寫一個版本,但是我確定仍然會存在變量問題。

有什麼建議嗎?

謝謝你的時間。

凱爾

+0

我真的不知道模擬是關於什麼的,但是如果它是(例如)在每次迭代中使用一個列表項,您可以使用偏移量來拆分它,即'thread 1:f(m [x]),thread 2:f(m [x + 1]),...線程n:f(m [x +(n-1)])'然後通過線程數'x + = n'增加'x'。另外,請考慮使用[cython](http://cython.org/)。 – rplnt

回答

2

如果你的代碼是純Python,並且使用的是CPython的,線程有可能你的代碼不會加快,由於global interpreter lock。你可能要找的是multiprocessing module,特別是它的Pool.map() method

由於使用mulitprocessing意味着使用單獨的進程而不是單獨的線程,所以像鎖定這樣的事情將變得更加不成問題。也就是說,使用NumPy對代碼進行矢量化或者使用像C或Cython這樣的高效編譯語言編寫內部循環可能會使您的併發速度提高得多,而不是將其並行化爲四個內核。

+0

我同意轉換爲NumPy會提高速度。但增加並行化應該能夠提供很好的加速。沒有理由不使用兩個! –

+0

我使用標準的純Python,所以我想這也被稱爲CPython。 我已經準備好使用NumPy並閱讀了一些關於矢量化的書,但仍然沒有完全理解它。由於我的模擬基本上是大約15個涉及物理學的相當線性的計算(即下一個方程依賴於前一個方程),所以我不確定我是否能夠計算出所有這些相關性。 我從來沒有聽說過Cython,但會開始閱讀它和Pool.map。 謝謝你的建議,我會讓你知道它是如何工作的。 –

+0

我懂了! 我的解決方案是使用多處理,建議,雖然我沒有使用pool.map()方法。根據我希望加載的內核數量,簡單地調用一個類是multiprocessing.process對象的修改版本,我可以得到我想要的。通過編寫完整的多線程版本以及多處理如何解決這個問題,我已經充分了解了GIL的煩惱。 謝謝你的建議! –