关于多线程:与Python 3.1.x相比,Python 3.2非常慢

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对我的应用程序来说是个灾难


这是没有明显的原因的。您需要对应用程序进行分析,以准确了解这段额外时间需要什么。