2012-02-19 72 views
7

我曾嘗試用Wing IDE(v.4.1.3)和Komodo IDE(v.7.0.0)調試Python 3。因爲,預計調試器會增加很多運行時間開銷。但令我感到驚訝的是調試器之間的差異。什麼決定了調試器的運行時性能

下面是同一個程序的運行時間。沒有斷點或別的,就沒有任何實際調試定期運行:

  • 被Python解釋器執行:26秒
  • 通過調試#執行1:137秒
  • 通過調試#執行2:1143秒

我將調試器稱爲匿名#1和#2,否則這將成爲其中一個無意(可能是誤導)的廣告。

其中一個調試器真的8倍「更快」?

還是有一些設計上的權衡,在一個更快的調試器提供了某些功能,或精密,或穩健,或什麼,以換取更高的速度?如果是這樣,我很想知道這些細節,無論是Wing/Komodo,還是一般的Python調試器。

+0

也許它正在等待一個斷點? – yak 2012-02-19 05:01:50

+0

@yak沒有斷點。直接跑到最後。 – max 2012-02-19 07:02:06

+0

沒有太多可能的功能。我猜想其中一個速度只是慢了8倍。但可能你必須分析和剖析代碼才能知道。 – 2012-02-19 08:12:37

回答

12

做一個優化的Python調試器是一樣的任何其他軟件:事情可以是真正不同的性能明智的(我是PyDev的作者,我做了PyDev調試器,所以,我可以評論它,但不是其他人,所以,我只解釋一下優化Python調試器 - 因爲我花了很多時間優化PyDev調試器 - 我不會談論其他實現,因爲我不知道如何他們已經完成了 - 除了pdb,但pdb並不是一個快速的調試器實現,它在達到一個斷點並且正在逐步完成它,儘管它通過運行一些未確定的事情,直到您真正執行將要啓動的代碼跟蹤你的代碼)。

特別是,任何'天真'的調試器都可以讓你的程序慢得多,只需在每一幀中啓用Python跟蹤並檢查每行執行的斷點是否匹配(這大致是pdb的工作原理:每當你輸入上下文它會跟蹤它,並且爲每一行調用它將檢查一個斷點是否與它匹配,所以,我相信任何期望速度很快的實現都不能真正依賴它)。

我知道PyDev調試有幾個優化......其中最主要的是:當調試器進入一個新的幀(即:功能),它會檢查是否有可能有打任何「勢」斷點,如果沒有,它甚至不會跟蹤該函數(另一方面,當程序執行後稍後添加斷點時,它必須去重新評估所有先前的假設,因爲任何當前幀都可能最終結束跳過一個斷點)。如果它確定應該跟蹤某個框架,它將爲該框架創建一個新實例,該實例將負責緩存與該框架相關的所有內容(這只是從Python 2.5中真正實現的,因此,在使用Python 2.4時和更早的版本,除非安裝了線程框架擴展,否則調試器會嘗試模擬它,這會使Python 2.4變得相當慢)。

此外,PyDev調試器目前利用Cython,儘管這僅限於CPython ... Jython,IronPython和PyPy沒有利用它),因此,許多優化仍然考慮純Python模式(幸運的是,Cython足夠接近Python,因此爲了使它在使用Cython的CPython上更快地工作,需要進行一些更改)。

關於PyDev調試優化發展一些相關的帖子:

http://pydev.blogspot.co.id/2017/03/pydev-560-released-faster-debugger.html

http://pydev.blogspot.co.id/2016/01/pydev-451-debug-faster.html

http://pydev.blogspot.com/2008/02/pydev-debugger-and-psyco-speedups.html

http://pydev.blogspot.com/2005/10/high-speed-debugger.html

不管怎麼說,在地方總是會增加一些開銷,調試器中運行(甚至w如PyDev調試器),因此,PyDev也提供了可用於pdb的相同方法:在代碼中添加一個斷點,並且它只會在該點開始跟蹤(這是PyDev的遠程調試器功能) :http://pydev.org/manual_adv_remote_debugger.html

並且根據您希望調試器支持的功能,它也可以更慢(例如,:當您在PyDev中爲捕獲的異常啓用中斷時,程序將執行得更慢,因爲它需要跟蹤更多事情才能正常中斷)。

+0

這是一個完美的答案 - 有時我會等待年齡(甚至3-4個數量級),以便我的代碼達到特定的斷點並從磁盤(我幾乎總是在使用調試器時測試更小的集合),但是在這裏我找到了一個解決方案 - 只在函數中放置一個斷點,而不是在腳本的頂層,並且瞧!現在速度非常快。非常感謝你的回答。 – 2016-09-29 14:55:11

2

這就像問爲什麼程序比計劃快B.其原因可能不是特定於調試的領域。

我想大多數圖形化調試器都建立在python標準庫中提供的pdb模塊的頂部或前端(儘管不是全部)。性能差異主要歸結爲實現細節和GUI更新開銷。其差別可能與在代碼的某一層執行不必要的深層複製和直接引用一樣簡單。

如果您擔心調試器的性能,那麼你應該用更快的圖形調試器堅持,除非它是不是滿足某些功能,您需要。你在問功能差異;既然是這樣,那麼它們顯然都是當前滿足功能需求的當前需求。

如果一個調試器丟失精度或犧牲魯棒性,那麼我會立刻貼現考慮。我會冒險猜測較慢的任一方爲:

  • 做額外的工作或不必要的檢查(如果開發商不信任代碼的其他部分,或者他們有太多的層或冗餘架構)。

  • 使用一些緩存不友好或浪費的表示或尚未調諧或優化的代碼算法不亞於更快調試器。正確的數據結構選擇和算法優化可以產生大小差異的順序。使用低級別的優化(如ctypes,psyco,pyrex)等。你可以做出另一個數量級的差異。請記住,python爲您提供了靈活而強大的默認容器,即使您不需要其所有功能,您也始終可以「付費」。

我發現WinPDB是相當輕巧,而且是一個我經常使用,因爲它沒有把我綁到IDE,並支持遠程調試非常有效。您可能還想嘗試與pydev日食。另一個我剛剛開始玩的新遊戲是Python Tools for Visual Studio,看起來很有希望。python wiki上還有一個list of python debuggers。這可能值得給別人一個嘗試。至於爲什麼一個人比另一個人快,有很多可能的因素。如果您有權訪問調試器的源代碼,則可能可以自行調試調試器以識別性能瓶頸。但是如果你只是想要一個能夠處理所有基本用例的快速調試器,那就試試更多,然後堅持最快的方式來滿足你的需求。

+0

這是很好的解釋,謝謝。現在我很好奇 - 即使是更快的調試器,導致6x運行時開銷的原因是什麼?畢竟,我沒有任何斷點。所有調試器需要做的就是捕捉異常(如果有的話),並能夠告訴我調用堆棧的每一層所有變量的值。物理名稱和變量名稱之間的地圖是否足夠? – max 2012-02-21 06:00:18

+0

@max不,根據實現情況,您可能會有很多開銷,例如保留和檢查模型或堆棧狀態表示和當前堆棧幀,何時中斷等。如果調試器代碼是在一個很高的抽象層次,當你進一步「遠離金屬」時,可能會產生巨大的開銷。當你通過優化獲得「更接近金屬」時,例如使用使用低級操作系統和硬件功能的c擴展,你失去了可移植性(即它不會是純python) – 2012-02-22 10:56:19

+0

你可能想看看這本書:[Gray Hat Python](http:// www。 amazon.com/Gray-Hat-Python-Programming-Engineers/dp/1593271921);特別是第3章,這是一個很好的介紹Python中實現調試器的基礎知識 – 2012-03-26 06:25:47

相關問題