|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 七彩云南 于 2023-1-30 14:35 编辑
- for i in range(65536):
- print(chr(i), end=" ")
复制代码
就这两行,在IDLE中一秒出5个字符,但是在CMD下执行,几秒钟就全部输出完了,不知道是什么原理 .
python版本3.10.9
本帖最后由 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 参数是没有任何作用的
|
|