我目前正在使用Python中的minmax樹ai。爲了從ai中擠出額外的性能,我一直在使用cython來優化瓶頸,並試圖對樹木進行多處理。使用cython進行緩慢多處理
我遇到的問題是,使用cython進行多處理時,ai確實比較慢。我知道有多處理的開銷,有時會導致它變慢。但是,使用cython時只會變慢。當使用等效的Python代碼時,多處理提供了2-3倍的性能提升。
我已經運行了幾個測試來排除任何明顯的問題。例如,我運行了啓用和不啓用alpha-beta修剪的測試(在沒有多處理的情況下,這可能會在某些情況下執行得更好),但它沒有區別。我已經將cython對象設置爲pickleable,並且多處理的cython ai構建了一個適當的樹。我正在使用的多處理實現(僅將根子項傳遞給pool.map函數)只會在使用純Python代碼時提高性能。
有沒有一些古怪的cython,我失蹤了?通過多處理使用cython代碼(或一般的c擴展)會帶來額外的開銷嗎?或者這是cython本身的問題?
編輯:下面是一些示例定時:
鑑於7的深度,並且沒有α-β修剪:(所有時間以秒計)
用Cython,無多處理:
12.457用Cython,多重:
15.440沒有用Cython,沒有多重:
26.010沒有用Cython,多重:
17.609
多的測試之後,我已經找到了開銷的原因。 @Veedrac是正確的,因爲使用c擴展會帶來額外的開銷,而python的緩慢掩蓋了沒有cython的開銷。具體而言,從多個處理器返回分支並將其添加到根節點時發生開銷。這解釋了爲什麼開銷不是恆定的,並且隨着樹的深度增加而實際擴大。
我實際上已經懷疑過這一點,並且在此之前進行了測試。然而,看起來我之前用來測試這個開銷的代碼是被竊聽的。我現在已經修復了多處理,只返回了必要的信息,並且開銷已經被消除了。具有多處理功能的Cython現在運行速度非常快。
你看過[Cython分析](http://docs.cython.org/src/tutorial/profiling_tutorial.html)嗎? – Schollii
@Schollii我試着分析多處理代碼,但它似乎不能很好地處理多處理。它只顯示佔用所有程序時間的thread.lock。 – PaintingInAir
@PaintingInAir看看[在這個答案](http://stackoverflow.com/a/22839233/832621),展示瞭如何在Cython的prange()中包裝openMP,使用'nogil'函數 –