Python 3.2 extremely slow when compare to Python 3.1.x
我通读了python 3.2的更改,并了解到它比3.1有了许多改进。但是,我在3.2上运行的零修改的完全相同的代码比在3.1.3上运行代码慢10倍多。
python 3.2花了6分钟将文件的二进制内容传输到物理设备,然后在屏幕上接收并打印接收到的数据,而在同一台PC上执行python3.1.3只需要30秒。
我使用python 3.1.2从零开始开发代码,20%的代码使用ctypes通过Windows驱动程序和USB/PCI设备执行事务,因此我认为这种性能冲击与向后兼容性没有任何关系。在我的应用程序中,我创建了四个threading.thread子类实例,每个子类处理系统上的一个PCI或USB设备。我怀疑CTypes 3.2的性能比以往任何时候都要差,或者线程的性能比以前差得多。我必须使用线程才能获得我想要的多线程性能。如果有人能为我遮光,我会非常感激的
===========================
更多诊断
我减少了要发送和接收的数据量
python 3.1.3用3秒钟完成删除,如系统资源监视器截图http://img62.imageshack.us/img62/5313/python313.png所示。
如系统资源监视器截图http://img197.imageshack.us/img197/8366/python32.png所示,python 3.2大约需要1分钟完成。
我的电脑是单核IntelP4,内存为2GB,所以我认为我们可以排除多核处理器的Gil因素。
我使用yappi分析多次运行,以平均3.1.3和3.2上的性能结果。我看到线程和CTypes在Python3.2上执行得很差。
这是访问随python包的标准Windows二进制文件提供的线程安全队列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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模块调用WindowsUSB驱动程序中的API,并从USB设备请求16位数据。
1 2 3 4 5 6 | 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对我的应用程序来说是个灾难
这是没有明显的原因的。您需要对应用程序进行分析,以准确了解这段额外时间需要什么。