2017-07-19 23 views
-1

我一直在嘗試使用Pygame爲python 3製作3D繪圖庫。我想使用Z-Buffer,所以我需要爲每個應繪製的像素調用函數。問題是繪製100x100像素的矩形需要超過1毫秒。爲矩形 繪圖功能嵌套函數調用環,它可以被簡化成這個代碼來顯示最大的瓶頸:如何加快python 3中函數調用的嵌套for循環?

def another_function(): 
    pass 

def test_function(): 
    for j in range(100): 
     for k in range(100): 
      another_function() 

功能another_function(),其不執行任何操作被稱爲總10000倍。當我測量執行時間時,timeit顯示test_function()需要1.09毫秒。這太長了,因爲需要繪製多個矩形並且要達到每秒60幀,一個幀必須少於17毫秒。

我試着尋找解決方案,但除了使用PyPy和Cython之外,我一直無法找到任何提高嵌套for循環的速度的函數調用的速度。

其他信息:我使用Python 3.5.2和Windows 10 64位作爲操作系統。我沒有找到PyPy for Windows的任何安裝程序,並且在編譯轉換爲.c的模塊時,Cython出現問題,因此我無法使用它。

+0

做你的函數內聯? – jeremycg

+0

PyPy for windows可以在這裏找到:https://bitbucket.org/pypy/pypy/downloads/ – Y0da

+1

_當你的Python有性能問題時/你的循環和調用運行得太慢/記住舊的智慧:/ **寫入C **!_ – zwer

回答

2

這取決於你在做什麼another_function()。如果你可以使用一些numpybroadcasting,你可以達到一些C速度。事實上,即使是python 3.6的最新改進,for循環仍然是爲了避免性能方面的原因。

例如看到answer。當numpy被正確使用時,在循環中有900倍的性能提升。

而且,你沒有提到它,但你可以用numba及其去的正是時候編譯器。這在純python循環的情況下特別適合。