2008-11-17 63 views
1

我有一個使用工作隊列和線程的端口掃描應用程序。如何計算Python中的字節碼,以便我可以適當修改sys.setcheckinterval

它使用簡單的TCP連接並花費很多時間等待數據包回來(最多半秒)。因此線程不需要完全執行(即前半部分發送數據包,上下文切換,做東西,返回到有網絡數據等待的線程)。

我懷疑我可以通過修改sys.setcheckinterval從默認值100(最多可以在切換到另一個線程之前執行100個字節碼)來提高性能。

但是不知道在一個線程或函數中實際執行了多少字節碼我是盲目的,只是猜測值,測試和依賴於測試顯示出可測量的差異(這是困難的,因爲執行的代碼量是最小;一個簡單的套接字連接,因此網絡抖動可能會影響任何測量,而不是改變sys.setcheckinterval)。

因此,我想知道在某些代碼執行過程中有多少字節碼(即一個函數或一個線程的執行總數),所以我可以更加智能地猜測如何設置sys.setcheckinterval。

回答

3

對於更高級別(方法,類)明智的,dis module應該有所幫助。

但是,如果需要更細的糧食,tracing將是不可避免的。跟蹤確實是一行一行的操作,但explained here是深入研究字節碼級別的好手段。向Ned Batchelder致敬。

2

「我懷疑我可以通過修改sys.setcheckinterval提高性能」

這很少奏效。正確的行爲不能依賴於時間 - 你無法控制時間。操作系統,硬件,Python的補丁級別或月亮階段的輕微變化將改變應用程序的行爲方式。您可以使用select模塊來等待I/O。您的應用程序可以構建爲主循環,select和queues可用於其他線程。其他線程正在等待處理請求隊列中的條目。

2

對這種複雜性系統的推理很少會產生正確的答案。測量結果,並使用運行速度最快的設置。如果像你說的那樣,測試不能測量setcheckinterval的各種設置的差異,那麼爲什麼要改變呢?只有可衡量的差異才是有趣的。如果您的測試運行時間太短而無法提供有意義的數據,請在運行之前進行更長的時間。

相關問題