【问题标题】:Python 3.2 extremely slow when compare to Python 3.1.x与 Python 3.1.x 相比,Python 3.2 非常慢
【发布时间】:2011-04-21 22:34:03
【问题描述】:

我通读了 Python 3.2 的更改,了解到它比 3.1 有了很多改进。但是,我在 3.2 上运行零修改的完全相同的代码比在 3.1.3 上运行代码慢 10 倍以上

Python 3.2 花了 6 分钟将文件的二进制内容传输到物理设备,然后在屏幕上接收并打印接收到的数据,而使用 Python 3.1.3 在同一台 PC 上执行完全相同的场景只需要 30 秒.

我使用 Python 3.1.2 从头开始​​开发我的代码,我的 20% 的代码使用 ctypes 通过 Windows 驱动程序与 USB/PCI 设备执行事务,所以我认为这种性能下降与向后兼容性无关.在我的应用程序中,我创建了四个 threading.Thread 子类实例,每个实例处理系统上的一个 PCI 或 USB 设备。我怀疑的事情是 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 所示

我的 PC 是具有 2 GB RAM 的单核 Intel P4,因此我认为我们可以排除多核处理器的 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 上所花费的时间要差 30 倍以上

Python 3.2 对我的应用程序来说似乎是一场灾难

【问题讨论】:

  • 你最终找到这是什么了吗?这可能是 Python 中的一种回归,它似乎不太可能改变语言行为,但您可能会仔细查看是否会出现这种情况。
  • 我最终从所有机器上卸载了 Python 3.2 并重新安装了 3.1.3

标签: python multithreading ctypes python-3.2 python-3.1


【解决方案1】:

没有明显的理由为什么会这样。您需要对应用进行概要分析,以准确了解需要额外时间的原因。

【讨论】:

  • 实时打印到屏幕上。意思是我的代码在收到数据后立即打印出它通过 Windows 驱动程序接收到的每个数据块。在 PYthon 3.2 上,打印速度很慢,以至于我可以在打印时读取屏幕上的每个二进制字符。在 Python 3.1.3 上,打印出来的速度太快,以至于在打印数据时我无法读取屏幕上的任何内容。这是一个主要的性能差异,而且是巨大的。在 3.1 上考虑 30 秒,在 3.2 上考虑 6 分钟。我认为 GIL 从 3.1 改进到 3.2...
  • @SCM:啊哈,这很有趣。您需要对应用进行概要分析,以确切了解需要额外时间的原因。
  • 我在我的多线程应用程序上编辑并发布了 yappi 分析,以比较 Python 3.2 和 Python 3.1.3。结果对于 Python 3.2 来说非常糟糕
  • @SCM:好的,这里的主要问题是为什么 qsize 被调用的频率是 5 次。这是性能损失的主要原因。老实说,我不确定为什么它被称为根本
  • 也许同一个 .py 文件正在被 3.2 和 3.1.3 编译成不同的 PyCodeObject 文件。在两个版本的python中运行时我都没有修改任何代码,所以我想不出还有什么其他原因导致两者之间存在差异。
猜你喜欢
  • 1970-01-01
  • 2021-02-13
  • 2017-05-07
  • 1970-01-01
  • 2014-10-21
  • 2015-01-27
  • 2014-09-06
  • 1970-01-01
  • 2020-08-01
相关资源
最近更新 更多