【发布时间】:2014-02-14 00:07:11
【问题描述】:
我无意中遇到了一个让我有点困惑的现象。我正在使用 IDLE 进行一些快速测试,并且我有一些非常简单的代码(为了便于说明,我已对其进行了简化):
from time import clock # I am presently using windows
def test_speedup():
c = clock()
for i in range(1000):
print i,
print '=>', clock() - c
现在我像这样运行这段代码(几次,基本结果相同):
# without pressing enter
>>> test_speedup()
0 1 2 3 4 . . . 997 998 999 => 12.8300956124 # the time to run code in seconds
# pressing enter ONLY 3 TIMES while the code ran
>>> test_speedup()
0 1 2 3 4 . . . 997 998 999 => 4.8656890089
# Pressing enter several times while the code ran
>>> test_speedup()
0 1 2 3 4 . . . 997 998 999 => 1.91522580283
我的第一个预感是,也许代码运行得更快,因为当我按下 Enter 时,输出系统可能不需要整理那么多的字符串(每次按下 Enter 时重新开始)。事实上,输出系统似乎总是在我按下回车后立即获得速度提升。
我也查看了documentation here,但我还是有点疑惑,为什么三个换行符会大大加快速度。
诚然,这个问题有些微不足道,除非想知道如何在不中止脚本的情况下加速 IDLE 中的输出系统。不过,我想了解这里的输出系统发生了什么。
(我使用的是 Python 2.7.x。)
【问题讨论】:
-
附带说明,不要尝试使用
time.clock()来计时;使用timeit。对于像这样的粗粒度测试,存在明显的数量级差异,这没什么大不了的,但值得养成正确做事的习惯。 -
@abarnert 点。感谢您提供有用的建议。
-
当我在 Mac 上运行它时,我实际上可以看到它随着线路变长而变慢。它逐渐变慢,还有两个点(大约 500 和 920)突然变慢了很多。这意味着这是长线问题,而不是阻塞输入问题……
-
潜在问题是 tcl/tk 文本小部件针对屏幕大小的行进行了优化,而对于“长”行则减慢了速度。但它将处理至少 500,000 条短线(我测试过的最多)。 Windows 控制台不会因长行而窒息,但只会在环形缓冲区中保留相当少的有限行数。最大9999,默认300。打印第301行时,删除第1行,以此类推。
标签: python python-idle