我通读了Python 3.2的变化,并了解到它比3.1有了许多改进。然而,我的完全相同的代码在3.2上运行时没有任何修改,比在3.1.3上运行时慢10倍以上
Python 3.2花了6分钟将文件的二进制内容传输到物理设备,然后接收并在屏幕上打印接收到的数据,而在同一台PC上执行完全相同的场景,Python 3.1.3只需要30秒。
我用Python 3.1.2从头开始开发我的代码,20%的代码使用ctypes通过带有USB/PCI设备的windows驱动程序执行事务,所以我不认为性能下降与向后兼容性有任何关系。在我的应用程序中,我创建了四个线程实例。线程子类,每个子类处理系统上的一个PCI或USB设备。我怀疑的是3.2的ctypes性能比以前更差了,或者有更多的线程。线程,我必须使用它来获得我想要的多线程性能。如果有人能帮我遮一下灯,我将不胜感激
=========================================
更diagopnistic我减少了要发送和接收的数据量
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
我的电脑是一个单核英特尔P4与2gb的RAM,所以我认为我们可以排除GIL因素多核处理器。
我使用yappi来分析多次运行,以平均3.1.3和3.2的性能结果。我发现线程和ctypes在Python 3.2中执行得很糟糕。
这是访问python包
的标准windows二进制文件提供的线程安全队列。on 3.1.3
name #n tsub ttot tavg
C:Python31libqueue.py.qsize:86 46070 1.352867 4.234082 0.000092
C:Python31libqueue.py._get:225 8305 0.012457 0.017030 0.000002
C:Python31libqueue.py.get:167 8305 0.635926 1.681601 0.000202
C:Python31libqueue.py._put:221 8305 0.016156 0.020717 0.000002
C:Python31libqueue.py.put:124 8305 0.095320 1.138560 0.000137
on 3.2
name #n tsub ttot tavg
C:Python32libqueue.py.qsize:86 252168 4.987339 15.229308 0.000060
C:Python32libqueue.py._get:225 8305 0.030431 0.035152 0.000004
C:Python32libqueue.py.get:167 8305 0.303126 7.898754 0.000951
C:Python32libqueue.py._put:221 8305 0.015728 0.020928 0.000003
C:Python32libqueue.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
上花费的时间要差30多倍。Python 3.2对于我的应用程序来说似乎是一场灾难
没有明显的理由。你需要对应用程序进行分析,看看究竟是什么占用了这些额外的时间。