鱼C论坛

 找回密码
 立即注册
查看: 2965|回复: 8

[已解决]这两句代码在IDLE里执行非常慢,为什么

[复制链接]
发表于 2023-1-30 14:33:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 七彩云南 于 2023-1-30 14:35 编辑
for i in range(65536):
    print(chr(i), end=" ")

就这两行,在IDLE中一秒出5个字符,但是在CMD下执行,几秒钟就全部输出完了,不知道是什么原理 .
python版本3.10.9
最佳答案
2023-1-30 17:23:32
本帖最后由 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 参数是没有任何作用的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-1-30 14:46:49 | 显示全部楼层
IDLE输出慢,CMD输出更快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-30 16:19:15 | 显示全部楼层
tommyyu 发表于 2023-1-30 14:46
IDLE输出慢,CMD输出更快

不对的,IDLE一秒只出5个字符,CMD一秒出10000多个,肯定不是这个原因.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-30 16:37:22 | 显示全部楼层
七彩云南 发表于 2023-1-30 16:19
不对的,IDLE一秒只出5个字符,CMD一秒出10000多个,肯定不是这个原因.

那不就是输出慢么,还能有什么原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-30 16:44:06 | 显示全部楼层
经测试,输出 1000 行 Hello 在 IDLE 中需要 10 秒,在 CMD 中仅需 0.5 秒,可见 CMD 的输出速度比 IDLE 快了约 20 倍。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-30 16:47:21 | 显示全部楼层
tommyyu 发表于 2023-1-30 16:44
经测试,输出 1000 行 Hello 在 IDLE 中需要 10 秒,在 CMD 中仅需 0.5 秒,可见 CMD 的输出速度比 IDLE 快 ...

对头,我在弄你那个密码的时候就发现这个问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-30 16:48:30 | 显示全部楼层
鱼cpython学习者 发表于 2023-1-30 16:47
对头,我在弄你那个密码的时候就发现这个问题

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-30 17:23:32 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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 参数是没有任何作用的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 3 反对 0

使用道具 举报

发表于 2023-1-30 17:57:49 | 显示全部楼层
看我上边的回答,要是解开了你的疑惑,一个最佳答案是对我莫大的鼓励,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-24 19:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表