Python: 为什么IDLE这么慢?
IDLE 是我最喜欢的 Python 编辑器。它提供了一个非常好用、直观的 Python 交互式环境,这对单元测试和调试非常有帮助,还有一个很不错的调试工具。
不过,在 IDLE 中运行的代码速度非常慢。这里的“慢”是指慢得离谱,具体来说是慢了大约 1000 倍:
bash
time echo "for i in range(10000): print 'x'," | python
运行时间是 0.052 秒,
IDLE
import datetime
start=datetime.datetime.now()
for i in range(10000): print 'x',
end=datetime.datetime.now()
print end-start
运行时间是:
>>> 0:01:44.853951
大约慢了 2000 倍。
有没有什么想法或者建议可以改善这个问题?我猜可能和后台的调试工具有关,但我不太确定。
Adam
2 个回答
11
问题出在Tkinter的Text组件上,它对非常长的行处理得不太好,而你正好创建了这样一行。你会发现,虽然很长的一行的任何部分都能看到,但滚动的时候却非常慢,简直让人抓狂。
31
问题出在文本输出上,而不是调试器。
我在我的Q6600(超频到3GHz)系统上试了一下,结果甚至更糟。很明显,随着输出文本的增加,性能在下降。
我尝试运行了:
1000次迭代 => 7.8秒
2000次迭代 => 28.5秒
3000次迭代 => 70秒
我以前做过一些底层的TK相关工作,知道TkText这个组件是用B树结构来存储文本的。逐个字符地添加文本是最糟糕的方法之一,但看起来IDLE就是这么做的。正常的做法是一次性获取更多数据,然后添加一大块文本。
令人惊讶的是,如果你写print 'x\n',输出速度会快很多。3000次迭代只需要7秒,而你的10000次只需19秒。
所以问题肯定出在向已有行添加单个字符上。IDLE的程序员似乎不太了解TkText的工作原理。
因此建议是,在你的文本中添加更多换行符,或者一次性输出更大块的内容,而不是仅仅输出一个'x'字符。