清除终端导致Collatz猜想程序大幅变慢,求优化方案
解决Collatz猜想程序进度条拖慢运行速度的问题
核心问题分析
你遇到的速度瓶颈完全是因为system('clear')频繁清屏导致的——每次清屏都会触发终端的大量渲染操作,对程序运行效率影响极大。
高效的进度条实现方案
方案1:使用回车符覆盖同一行输出(无需清屏)
直接用\r将光标移回行首,覆盖原有内容,避免全量清屏,这是最轻量化的实现方式,几乎不影响程序速度。修改你的collatz函数如下:
def collatz(N): full_sequence = [] for i in range(2, N + 1): sequence = [] # 使用\r回到行首,覆盖输出进度,end=''避免自动换行 print(f'\r进度: {round(((i / N) * 100), 1)}%', end='', flush=True) while i != 1: sequence.append(i) if i % 2 == 0: i = i // 2 else: i = (i * 3) + 1 sequence.append(1) full_sequence.append(sequence) # 进度完成后换行,避免后续输出和进度条重叠 print('\n计算完成') return full_sequence
\r:让光标回到当前行的开头,新输出会覆盖原来的内容end='':阻止print自动添加换行符flush=True:强制立即输出内容,避免缓存导致进度不实时更新
方案2:优化Collatz序列计算(额外提升整体速度)
你的原代码存在大量重复计算,比如计算i=6时,会重复计算3的序列,用缓存(字典)存储已计算过的序列长度,可以让程序整体速度提升几个量级:
def collatz_with_cache(N): # 缓存:key是数字,value是该数字对应的序列长度 cache = {1: 1} max_length = (1, 1) # (长度, 数字) for i in range(2, N + 1): print(f'\r进度: {round(((i / N) * 100), 1)}%', end='', flush=True) current = i sequence_length = 0 while current not in cache: sequence_length += 1 if current % 2 == 0: current = current // 2 else: current = current * 3 + 1 # 把当前数字的序列长度存入缓存 cache[i] = sequence_length + cache[current] # 更新最长序列记录 if cache[i] > max_length[0]: max_length = (cache[i], i) print('\n计算完成') return max_length
这个版本不需要存储所有序列,只存长度,内存占用更小,速度快得多。
PyCharm终端适配说明
PyCharm的内置终端完全支持\r的换行覆盖操作,不需要额外库,直接用上面的代码即可正常显示进度条。
内容的提问来源于stack exchange,提问作者Jackson Vliet
相关产品推荐
相关产品推荐

