Python 3.2相比Python 3.1.x极慢

1 投票
1 回答
989 浏览
提问于 2025-04-16 16:12

我看过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 个回答

2

没有明显的理由说明为什么会这样。你需要对这个应用进行性能分析,看看究竟是什么导致了额外的时间消耗。

撰写回答