2011-04-21 210 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