这两句代码在IDLE里执行非常慢,为什么
本帖最后由 七彩云南 于 2023-1-30 14:35 编辑for i in range(65536):
print(chr(i), end=" ")
就这两行,在IDLE中一秒出5个字符,但是在CMD下执行,几秒钟就全部输出完了,不知道是什么原理 .
python版本3.10.9 IDLE输出慢,CMD输出更快 tommyyu 发表于 2023-1-30 14:46
IDLE输出慢,CMD输出更快
不对的,IDLE一秒只出5个字符,CMD一秒出10000多个,肯定不是这个原因. 七彩云南 发表于 2023-1-30 16:19
不对的,IDLE一秒只出5个字符,CMD一秒出10000多个,肯定不是这个原因.
那不就是输出慢么,还能有什么原因{:10_277:} 经测试,输出 1000 行 Hello 在 IDLE 中需要 10 秒,在 CMD 中仅需 0.5 秒,可见 CMD 的输出速度比 IDLE 快了约 20 倍。 tommyyu 发表于 2023-1-30 16:44
经测试,输出 1000 行 Hello 在 IDLE 中需要 10 秒,在 CMD 中仅需 0.5 秒,可见 CMD 的输出速度比 IDLE 快 ...
对头,我在弄你那个密码的时候就发现这个问题{:10_282:} 鱼cpython学习者 发表于 2023-1-30 16:47
对头,我在弄你那个密码的时候就发现这个问题
{:10_256:} 本帖最后由 isdkz 于 2023-1-30 17:43 编辑
先来看看缓冲区的概念:https://blog.csdn.net/qq_33898609/article/details/118878964
总而言之,缓冲区是内存的一部分,当高速设备与低速设备共同协作的时候低速设备势必会拖慢高速设备,
这个时候需要一个缓冲来缓解高速设备太快,低速设备太慢的尴尬,这也是缓存和内存存在的意义。
再来看:
分别在 cmd 和 idle 中执行以下两行代码:
import sys
print(hasattr(sys.stdout, 'buffer'))
可以看到在 cmd 中的执行结果为 True,而在 idle 中执行结果为 False,
这说明在 cmd 中是有缓冲区的,而在 idle 中没有,这也就是为什么 idle 输出比 cmd 慢的原因
如果你每次输出的时候都刷新缓冲区,你会发现输出也会慢上许多:
for i in range(65536):
print(chr(i), end=" ", flush=True) # 加上 flush = True 刷新缓冲区
但是依然没有在 idle 上输出慢,这是为什么呢,因为虽然你手动刷新了缓冲区,但是缓冲区还是在的,只是不让他缓存那么多数据而已
其实你自己也已经摸到了现象的本质,为什么 cmd 一下子输出了这么多字符,而 idle 一下子输出的字符这么少,
自然是因为 cmd 有缓冲区,它等缓冲区满了才输出(除非加了 flush=True 刷新缓冲区,刷新缓冲区的时候将会把已经缓存的数据立即输出而不等缓冲区满),而 idle 没有缓冲区,它是一个一个字符地输出的,
而又因为计算机的速度比人的思维要快,才会让你觉得它一秒输出了几个字符,其实那几个字符对于没有缓冲区的 idle 来说并不是同时输出的
小知识:因为 idle 没有缓冲区的缘故,所以在 idle 中 print 的 flush 参数是没有任何作用的 看我上边的回答,要是解开了你的疑惑,一个最佳答案是对我莫大的鼓励,谢谢{:5_92:}
页:
[1]