2011-04-21 220 views
1

我通過閱讀Python 3.2的更改並瞭解到它已經比3.1版做了很多改進。然而,我在3.2上運行零修改的完全相同的代碼比在3.1.3上運行我的代碼時慢了10倍以上。與Python 3.1.x相比,Python 3.2速度非常慢

然後,使用Python 3.2六分鐘將文件的二進制內容傳輸到物理設備,然後接收和打印出屏幕上接收到的數據,當在同一臺PC上完全相同的場景僅用30秒就可以用Python 3.1.3執行。

我從頭開始用Python 3.1.2開發我的代碼,20%的代碼使用ctypes通過帶有USB/PCI設備的Windows驅動程序執行事務,所以我不認爲這種性能與後向有什麼關係兼容性。在我的應用程序中,我創建了四個threading.Thread子類的實例,每個子類都處理系統上的一個PCI或USB設備。我懷疑的事情是,3.2的ctypes性能比以前更糟糕,或者線程更多。線程必須與我一起玩,以獲得我想要的多線程性能。將不勝感激,如果任何人都可以爲我遮擋一些燈光

================================== =======

更diagopnistic

我降低如本系統資源監視器屏幕截圖被髮送&接收

蟒3.1.3花費3秒鐘,以comelete數據量http://img62.imageshack.us/img62/5313/python313.png

python 3.2花費大約1分鐘完成,如圖所示系統資源監視器屏幕截圖http://img197.imageshack.us/img197/8366/python32.png

我的電腦是帶有2 GB內存的單核英特爾P4,所以我認爲我們可以排除多核處理器的GIL因素。

我用yappi來分析多次運行來平均3.1.3和3.2的性能結果。我發現線程和ctypes在Python 3.2上執行的很糟糕。

提供Python包的標準的Windows二進制

on 3.1.3 
name         #n  tsub  ttot  tavg 
C:\Python31\lib\queue.py.qsize:86 46070 1.352867 4.234082 0.000092 
C:\Python31\lib\queue.py._get:225 8305  0.012457 0.017030 0.000002 
C:\Python31\lib\queue.py.get:167  8305  0.635926 1.681601 0.000202 
C:\Python31\lib\queue.py._put:221 8305  0.016156 0.020717 0.000002 
C:\Python31\lib\queue.py.put:124  8305  0.095320 1.138560 0.000137 

on 3.2 
name         #n  tsub  ttot  tavg 
C:\Python32\lib\queue.py.qsize:86 252168 4.987339 15.229308 0.000060 
C:\Python32\lib\queue.py._get:225 8305  0.030431 0.035152 0.000004 
C:\Python32\lib\queue.py.get:167  8305  0.303126 7.898754 0.000951 
C:\Python32\lib\queue.py._put:221 8305  0.015728 0.020928 0.000003 
C:\Python32\lib\queue.py.put:124  8305  0.143086 0.431970 0.000052 

線程明智性能這是訪問線程安全隊列是剛上的Python 3.2

另一個例子出奇的差。此功能只需通過ctypes的模塊調用在Windows USB驅動程序API,並要求16位數據從USB設備

on 3.1.3 
name         #n  tsub  ttot  tavg 
..ckUSBInterface.py.read_register:14 1  0.000421 0.000431 0.000431 
on 3.2 
name         #n  tsub  ttot  tavg 
..ckUSBInterface.py.read_register:14 1  0.015637 0.015651 0.015651 

,你可以看到,所花費的時間是Python的3.2

糟糕的30倍以上Python的3.2似乎是我的應用程序

+0

你最終追查這是什麼?這可能是Python的一種迴歸,它似乎不太可能會改變語言行爲,但你可能會仔細看看是否可能出現這種情況。 – 2011-06-15 12:05:24

+0

我結束了從所有機器上卸載Python 3.2並重新安裝3.1.3 – SCM 2011-07-26 01:42:39

回答

2

沒有明顯的原因,這應該是一場災難。您需要對應用進行配置才能看到需要額外時間的內容。

+0

打印輸出到屏幕上是實時的。只要數據被接收到,我的代碼就會打印出它接收到的每一塊數據。在PYthon 3.2上,打印輸出速度很慢,我可以在打印時閱讀屏幕上的每個二進制字符。在Python 3.1.3上,打印輸出速度太快,導致在打印數據時無法讀取屏幕上的任何內容。這是一個主要的性能差異,它是巨大的。在3.1上考慮30秒,在3.2上考慮6分鐘。我認爲GIL從3.1改進到了3.2 ... – SCM 2011-04-21 23:39:41

+0

@SCM:啊哈,這很有趣。您需要對應用進行簡介以準確瞭解需要額外時間的內容。 – 2011-04-22 10:06:58

+0

我編輯並在我的多線程應用程序上發佈了yappi分析,用於Python 3.2和Python 3.1.3之間的比較。 Python 3.2 – SCM 2011-04-22 22:17:00

相關問題