2015-12-29 47 views
1

如果我將我的python文件編譯爲cython,我會看到速度的提高嗎?或者我需要用cython重寫我的代碼才能看到改進?將編譯python文件到cython加速程序?

我正在這樣做下面。

python convert_to_cython.py build_ext --inplace 
+2

爲了獲得'cython'的最佳改進,您需要閱讀'cython'文檔。關於通過cython獲得預期的改進,有很多問題和答案。研究那些。 – hpaulj

+0

另外,我不明白你的例子應該做什麼。什麼是'convert_to_cython.py'?看起來你正在爲實際的Python源代碼混淆['setup.py'文件的distutils擴展](http://docs.cython.org/src/userguide/source_files_and_compilation.html)。 –

回答

-2

雖然這個問題很廣泛,但總體而言YES。它在100

僅供參考順序並加快你的代碼,有時,在用Cython文檔說我引用

但是,出於性能關鍵代碼,它往往是有益的添加靜態類型聲明,因爲它們將允許用Cython走出的Python代碼的動態特性,併產生更簡單和更快速的C代碼 - 有時快幾個數量級

的主要原因語言,如C/C++更快的是他們創建了機器相關彙編語言來調整所有與硬件相關的優化。這是使用編譯器主要是因爲一些事情取得像

  1. 靜態類型變量
  2. 循環展開
  3. 分支預測

等。

現在,其中一個重要的特徵靜態的類型變量被Cython廣泛使用。由於python變量是無類型的,C變量不是,Cython可以讓用戶靈活地修改它們的變量類型。

在Cython doc website中,他們展示瞭如何通過提及實際產生的類型來提高性能。

注意但是我的最後一句話是,你要小心,而在用Cython轉換Python代碼,因爲你可以使用一些框架,項目/原料藥不具有用Cython支持。有時即使您將代碼轉換爲Cython,也幾乎不會改變任何內容。所以這一切都取決於你的代碼。

因此,首先確保您的Python代碼在Cython中具有完全的可移植性,並檢查是否絕對有必要。

編輯1還有一件事是在Cython中轉換你的代碼,使它更不可讀,所以請注意這一點。

從用Cython文檔

再次引用

必須指出,然而,該類型的聲明可以使源代碼更詳細的,因此較少的可讀性。因此氣餒使用它們沒有很好的理由,例如在基準測試證明他們確實使代碼大大快於性能關鍵部分

編輯2回答的問題或者我需要重寫我在cython中的代碼實際上看到了改進?

沒有,因爲Cython編譯器會爲您做所有事情。

Cython編譯器會將它轉換爲C代碼,它會對Python/C API進行等效調用。

由於Cython幾乎可以接受任何有效的python源文件,因此入門最困難的事情之一就是弄清楚如何編譯擴展。

欲瞭解更多信息請訪問this

+1

第一個引用與你的答案相矛盾。 –

+1

@ IgnacioVazquez-Abrams第一句話說,通過靜態提及類型,它創建了更快的可執行文件,我在我的回答中也提到了相同的內容。那我怎麼矛盾? –

+2

「或者我需要在cython中重寫我的代碼才能看到改進?」添加靜態聲明是重寫它的一部分。 –

3

因爲它的立場,這個問題是過於寬泛,因爲答案在很大程度上取決於你的Python代碼是什麼樣子。沒有看到它,或者至少對它做了什麼有一些想法,不可能給你一個直截了當的答案。

如果您的代碼主要調用其他編譯庫的函數,那麼您可能會看到沒有改進,甚至更慢的運行時。例如,有些人無法理解爲什麼Cython不會神奇地加速他們的numpy代碼,所以有SOO lotsofquestions。但是,嵌套的Python for循環可以成爲加速使用Cython的非常好的候選對象。

您的第一步應該始終是簡介您的代碼(例如使用優秀的line_profiler)。一旦確定了瓶頸,那麼你可以考慮如何加速它們,可能是通過在Cython中重寫它們。在Cython中重寫所有現有的Python代碼幾乎肯定會浪費時間。