2012-06-09 25 views
5

我期待爲現有應用程序帶來速度改進,並且正在尋找關於我的可能選項的建議。該應用程序是用Python編寫的,使用wxPython,並與py2exe(我只針對Windows平臺)打包在一起。應用程序的一部分計算量很大,並且在解釋的Python中運行得太慢。我對C不熟悉,因此移植部分代碼對我來說不是一個真正的選擇。使用PyPy或Shedskin加速現有Python應用程序的某些部分

所以我的問題基本上是我有一個清晰的圖片我的選擇,我下面概述,或者我是從一個錯誤的方向接近?

  • 與pypy運行:今天,我開始與Pypy實驗 - 結果是令人興奮的,因爲我可以從pypy解釋器中運行該代碼的大部分地區,我看到5倍+速度的提高,沒有更改代碼。但是,如果我理解正確,(a)支持wxpython的Pypy是still a work in progress,並且(b)I cannot compile it down to an exe for distribution anyway。所以,除非我錯了,這對我來說似乎是不可行的?沒有辦法打包東西,所以它的一部分是用pypy來執行的?
  • 將代碼轉換爲RPython,翻譯爲pypy因此,下一個選項似乎實際上是將部分代碼重寫爲pypy限制語言,這似乎是一個相當大的工作。但是,如果我這樣做,部分代碼可以編譯爲可執行文件(?),然後通過ctypes(?)訪問代碼。
  • 其他受限制選項棚子似乎是一個受歡迎的替代品,這是否符合我的要求更好?其他選項似乎是Cpython,Psyco和Unladen,但它們都被取代或不再維護。

回答

6

使用PyPy確實排除了py2exe和類似的工具,至少直到一個被移植(AFAIK沒有活動的工作)。儘管如此,由於不需要安裝PyPy二進制文件,因此您可能會得到一個更復雜的分發版,其中包含Python源代碼和PyPy二進制文件+ stdlib,並使用小型包裝器(批處理文件,可執行文件)來簡化啓動過程。我無法評論PyPy上的WxPython是否足夠成熟,但是可能有人在pypy-dev,wxpython-dev或任何一個IRC頻道上都可以給出建議,如果你描述了你的情況。

將您的代碼翻譯成RPython對我來說似乎不可行。翻譯工具鏈並不是真正用於通用開發的工具,而生成用於嵌入/ ctypes的C dll似乎並不重要。另外,RPython代碼真的是的低級別,使得您的Python代碼受到足夠的限制可能相當於重寫它的一半。

至於其他受限選項:您似乎將Cython(一種類似Python的語言的編譯器,它發出適合CPython擴展模塊的C代碼)與CPython(用C語言編寫的原始Python解釋器)混合在一起。這兩個項目都很活躍。我對Shedskin並不是很熟悉,但它似乎是開發整個程序的工具,很少或根本不與非限制的Python代碼進行交互。 Cython似乎更適合:雖然它需要手動類型註釋和較低級別的代碼才能獲得非常好的性能,但從Python使用它很簡單:該項目的目的是生成擴展模塊。

+0

非常感謝,我接受了你的回答。然而,在與Cython打了一個非常高效的下午之後,我想我已經遇到了一個無法克服的問題:Cython缺乏線程支持。我之前在線程中運行並且沒有鎖定GUI的計算昂貴的計算現在凍結了所有內容。 從谷歌搜索,似乎這是設計;獲得並行性(http://docs.cython.org/src/userguide/parallelism.html#parallel)是釋放GIL,並且GIL中的所有代碼都不能使用任何本地python對象,我是否正確理解這一點?這會讓Cython不好。 – misshapen

+0

@NickJ(1)我不知道Cython是否支持Python線程 - 但我不明白爲什麼它不能。也許你鏈接到的替代品只是*首選*,因爲它可以使用多個CPU。 (2)我不確定這是否是你的拼寫錯誤,但受GIL *保護的代碼將能夠使用Python類型,而「nogil」部分不能(因爲CPython以及所有Python類型依賴於GIL)。 (3)除此之外,您可以在Cython中不使用「線程化」,將任何想要並行化的東西放入相對純的Cython函數中,並通過Python啓動線程。 – delnan

3

我一定會考慮Cython,我一直在玩它,並已經看到超過純Python的100倍的加速。首先使用配置文件模塊查找瓶頸。通常這些循環是去Cython時增加速度的最大機會。你還應該考慮一下,如果你可以在Numpy中使用數組/矢量操作而不是循環,如果可以的話,也可以提供極大的性能提升。例如:

a = range(1000000) 
for i in range(len(a)): 
    a[i] += 5 

很慢,真的很慢。另一方面:

a = numpy.arange(10000000) 
a = a +5 

是快速,真正快速。

+0

+1,用於儘可能地將數字移動到numpy。 – huon

+0

對於如此大的陣列,+ = 5可能更快 – Dhara

0

更正:shedskin可用於生成擴展模塊,以及整個程序。

相關問題