2013-03-13 67 views
3

我一直在轉換爲cython一些python函數和我正在開發的一個項目中的類。所以現在我有各種.pyx文件和相應的.py文件,它們包含基本相同的代碼,而cython文件包括變量類型。但是,有時候,cython會包含一些python代碼的小修改 - (1),因爲修改後的代碼比保留相同的python表單更快(但是相當於)。我是否以正確的方式使用了cython?

在開始時,我並不認爲這種代碼的重複性會成爲問題。另外,我打算定期比較python和cython實現的輸出結果,以便我能夠更快地對任何一個或另一個進行無意的修改。問題是我有更多的工作來保持兩個實現同步,因爲我發現錯誤,進行改進等。這讓我想知道這是使用cython的正確方式。

我知道,理想情況下,你會做所有你的項目在Python中,然後如果它很慢,找到熱點和cythonize這些。然而,在我的項目中,我使用python作爲matlab替代品,以便在我正在開發的增強現實系統中交互式地對算法進行原型設計。該系統實時工作,所以我通常會盡早對新算法進行細化以獲得更高的fps,並瞭解它的實時表現。

所以我的問題:這涉及到很多用Cython代碼

待辦事項項目重複的代碼? .pyx文件和相應的.py文件?並保持同步?或者他們只使用cython並直接在cython中開發新的算法?那麼就不會有重複的代碼。但是,我無法在我最喜歡的python IDE(wingIDE)中調試cython代碼。對於這個問題,我從來沒有設法讓cygdb在Windows 7中工作(經過很長一段時間,我認爲它只能在linux下工作),所以我堅持用打印語句調試cython代碼,這並不理想,基本上我放鬆了我可以用python和wingIDE做的所有交互式開發(matlab like)。

然後是純python模式http://docs.cython.org/src/tutorial/pure.html我喜歡使用.pxd文件來擴充我的python代碼,然後我不會有重複的代碼問題。我還沒有嘗試過,但我已經閱讀了一些限制,所以我不確定它是否運行良好。另外,我不知道如果使用純python模式,我可以將上面(1)中提到的python代碼中的這些小修改集成到一起。這些可以放在一個pxd文件中嗎?或者我會不得不有一個pxy文件的修改?或者更好地忘記修改任何東西。有沒有人有純Python模式的良好體驗?

我不知道是否有另一種更好的方式使用cython,所以請,如果你知道更好的方式讓我們知道。

+0

我不明白:你爲什麼「失去了所有的互動發展」?當你使用'cpdef'函數時,你可以在ipython中使用它們......你可以創建一個小的'.pyx'文件來測試代碼片段......你錯過了什麼?只是調試器? – 2013-03-14 12:08:42

+0

是的。當我的意思是「交互式開發」時,我的意思是編寫代碼並在停止在斷點時對其進行測試,並訪問所有堆棧幀。 WingIDE調試器允許這樣做,而且這是我在python世界中發現的最接近我在matlab中開發時所發現的。我試過ipython,但我無法模仿這種類型的devloping與它。 – martinako 2013-03-14 13:18:53

+0

至少有一個維護Python和Cython版本的有效參數:測試。 Python中的簡單實現可用於驗證Cython版本的結果,以及小問題實例。 – 2015-07-11 02:34:45

回答

3

簡短的回答是:不,python項目不保留cython和python代碼。保持兩者的負擔過重。

以下是我如何使用cython:我首先在Python中實現代碼。通常,我測試小數據集,所以速度不是問題。如果我看到代碼太慢,我嘗試在Python中找到優化。如果我找不到任何東西,我嘗試對代碼進行集成。一旦完成,我將比較python實現和cython之間的加速比(ipython的%timeit魔術函數)。

確實,cython代碼比python代碼更復雜。但通常,我開始編寫cython代碼,我有一個無bug的算法。另外,回溯包含引發異常的cython代碼的行號。如果你的代碼段錯誤,你可以嘗試使用gdb來調試它[1] _

我還沒有使用pxd文件。

[1] _ http://scipy-lectures.github.com/advanced/debugging/index.html#debugging-segmentation-faults-using-gdb

+0

感謝您的回答。我認爲只有cython文件會成爲一個問題,因爲我可能會在每次嘗試子系統的新技術時更改該代碼。然後我需要再次將它轉換回python進行調試。在cython中調試新代碼會導致爲什麼我使用python來做我的研究,而不是直接在C++中進行。我使用數據集來測試算法,但我也希望看到他們正在使用實時視頻(因爲我正在開發交互式系統)。 – martinako 2013-03-14 11:39:40

+0

@NelleV:從統計學角度看,任何一段代碼都會留下殘差,不管是Python還是Cython。信任Python實現並不意味着從它派生的Cython版本的正確性(除非Cython版本是相同的,即純Python)。 – 2015-07-11 02:31:18

+0

@martinako:直接編寫Cython是過早的優化,除非不可能爲Python中的特定字段執行任何有意義的開發。實驗應該是用Python開發的,只有選定的,已經建立完善的核心部分被推到更低的層次。分析器可以幫助確定哪些部分。 – 2015-07-11 02:33:51