You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

清除终端导致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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:22:25