Python:为什么IDLE这么慢?

Ada*_*tan 22 python performance python-idle

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

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

庆典

time echo "for i in range(10000): print 'x'," | python
Run Code Online (Sandbox Code Playgroud)

需要0.052秒,

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

注意到:

>>> 0:01:44.853951
Run Code Online (Sandbox Code Playgroud)

这大约慢了2000倍.

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

亚当

Lot*_*har 30

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

我只是在我的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"字符.

  • 还有IDLE开发人员吗?我认为这个程序处于纯维护模式.我个人会称这是一个错误. (6认同)
  • tzot:它不是一个bug而是一个设计限制 - tk以及许多早期的GUI工具包会立即更新,除非另有指定(批处理操作).较新的工具包(如WPF和JavaFX)切换到用于UI呈现的后台和独立线程 - 检测窗口小部件树中的更改并根据屏幕刷新率重绘 - 从而使上述问题无效,但不会引入其他类型的开销.在WPF中,他们甚至添加了定时事件回调来解决应用程序层代码中的类似问题. (2认同)

tzo*_*zot 9

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