【问题标题】:Python: Why is IDLE so slow?Python:为什么 IDLE 这么慢?
【发布时间】:2011-01-13 20:08:10
【问题描述】:

IDLE 是我最喜欢的 Python 编辑器。它提供了非常漂亮和直观的 Python shell,这对于单元测试和调试非常有用,并且是一个简洁的调试器。

但是,在 IDLE 下执行的代码非常慢。我说的疯狂是指 3 个数量级 慢:

重击

time echo "for i in range(10000): print 'x'," | python

耗时 0.052 秒,

空闲

import datetime
start=datetime.datetime.now()
for i in range(10000): print 'x',
end=datetime.datetime.now()
print end-start

拍摄:

>>> 0:01:44.853951

这大约慢了 2,000 倍。

有任何想法或想法如何改进这一点?我猜这与后台的调试器有关,但我不太确定。

亚当

【问题讨论】:

  • 如答案所示,长行处理缓慢是 tcl/tk 面向行的文本小部件的一个已知问题。与最近的 tcl/tk 8.6.4(在 Windows 上随 3.5.0 一起分发)的结果大致相同。

标签: python performance python-idle


【解决方案1】:

问题在于 Tkinter Text 小部件,它对非常长的行的管理效率低下,而您创建了一个。 您会注意到,虽然很长的一行的任何部分都是可见的,但所有滚动都非常缓慢。

【讨论】:

    【解决方案2】:

    问题是文本输出而不是调试器。

    我刚刚在我的 Q6600(3GHz 超频)系统上尝试了它,但我的数字更糟。 但很容易看出,添加的输出文本越多,它们就会下降。

    我尝试用

    运行它

    1000 次迭代 => 7.8 秒 2000 次迭代 => 28.5 秒 3000 次迭代 => 70 秒

    我过去做过一些低级别的 TK 工作,我知道 TkText Widget 将文本保存在 BTree 结构中。一次添加一个字符是最糟糕的方法之一,但这似乎是 IDLE 正在做的事情。通常的方法是捕获更多数据并附加更大的文本块。

    令人惊讶的是,如果您编写 print 'x\n' 输出会快得多。 7 秒内迭代 3000 次,19 秒内迭代 10000 次。

    所以问题肯定在于将单个字符附加到现有行。 IDLE 程序员不知道 TkText 是如何工作的。

    因此建议在文本中添加更多换行符或输出更大的块,而不仅仅是单个“x”字符。

    【讨论】:

    • +1 以获得出色、全面的答案。您是否碰巧知道 IDLE 开发人员是否将此视为错误?
    • 这不是IDLE中的错误;如果它是一个错误,那么它在 Tkinter 的 Text 小部件中。
    • 还有IDLE开发者吗?我以为这个程序处于纯维护模式。我个人认为这是一个错误。
    • Lothar,我和我相信以前的 IDLE 开发人员都非常了解 tk Text 小部件的工作原理。它绝对是面向行的,但处理很长的行很糟糕。这通常不是实际应用。虽然任何既生成文本又将文本插入到 Text 小部件中的人都可以适当地缓冲和插入大块,但 IDLE 不会生成文本。它仅在指示时插入程序员生成的文本。如果有人说“将 1 个字符附加到该行”,IDLE 就会这样做。如果没有,那将是一个错误。 IDLE 无法知道多久之后会有另一个print
    • tzot:这不是错误,而是设计限制 - tk 以及许多早期的 GUI 工具包会立即更新,除非另有说明(批量操作)。较新的工具包(例如 WPF 和 JavaFX)切换到后台和独立线程以进行 UI 渲染 - 检测小部件树中的更改并根据屏幕刷新率重绘 - 因此消除了上述问题,但并非没有引入其他类型的开销。在 WPF 中,他们甚至添加了定时事件回调来解决应用层代码中的类似问题。
    猜你喜欢
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2018-10-08
    • 2012-11-12
    • 2016-09-28
    相关资源
    最近更新 更多