Python 3.2相比Python 3.1.x极慢
我看过Python 3.2的更新内容,了解到它在3.1版本上做了很多改进。不过,我的代码在3.2上运行时,速度比在3.1.3上慢了超过10倍,完全没有改动。
在Python 3.2上,传输一个文件的二进制内容到一个物理设备,然后接收并在屏幕上打印出接收到的数据,花了六分钟。而在同一台电脑上,使用Python 3.1.3执行同样的操作只需要30秒。
我从零开始用Python 3.1.2开发了我的代码,其中20%的代码使用ctypes通过Windows驱动与USB/PCI设备进行交互,所以我觉得这个性能下降和向后兼容性没有关系。在我的应用中,我创建了四个线程,每个线程处理系统中的一个PCI或USB设备。我怀疑的是,Python 3.2中的ctypes性能变得更差了,或者我需要更多地了解threading.Thread,才能获得我想要的多线程性能。如果有人能给我一些建议,我会非常感激。
=========================================
更多诊断信息
我减少了要发送和接收的数据量。
在这个系统资源监控截图中,Python 3.1.3完成任务花了3秒钟 http://img62.imageshack.us/img62/5313/python313.png
而Python 3.2完成任务大约花了1分钟,具体情况可以在这个系统资源监控截图中看到 http://img197.imageshack.us/img197/8366/python32.png
我的电脑是单核的Intel P4,内存2GB,所以我认为可以排除多核处理器的GIL因素。
我使用yappi对3.1.3和3.2的多次运行进行了性能分析,发现Python 3.2中的线程和ctypes性能都很差。
这是访问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,并请求从USB设备获取16位数据
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上所需的时间比3.1.3多了超过30倍。
对于我的应用来说,Python 3.2简直就是个灾难。
1 个回答
没有明显的理由说明为什么会这样。你需要对这个应用进行性能分析,看看究竟是什么导致了额外的时间消耗。