如何让tqdm在结合primesieve的Python while循环中显示进度条?
问题分析与解决方案
你的代码无法正常显示进度条的核心原因是:
- 进度条的
total参数设为了n(比如2**32是42亿+),但循环的实际迭代次数是小于等于n的素数个数(2**32的素数约2亿个),两者量级差距极大 - 每次调用
update(prime)是错误的,因为每次循环仅处理1个素数,应该更新1步而非当前素数的数值
修正后的代码
首先确保安装tqdm:
pip install tqdm
使用primesieve.count_primes(n)快速获取素数总数,以此作为进度条的总步数,每次循环更新1步:
import primesieve from tqdm import tqdm def prob(n): it = primesieve.Iterator() p = 1 prime = it.next_prime() # 获取小于等于n的素数总数,作为进度条总进度 total_primes = primesieve.count_primes(n) with tqdm(total=total_primes) as pbar: while prime <= n: p *= (1 - 1/prime) prime = it.next_prime() pbar.update(1) return p
关键说明
primesieve.count_primes(n)是primesieve库提供的高效函数,能快速计算小于等于n的素数数量,不会引入额外性能开销- 使用
with语句可以自动完成进度条的初始化与关闭,避免资源泄漏 - 每次循环调用
pbar.update(1),对应处理1个素数的进度,确保进度条显示准确
测试时直接调用prob(2**32)即可看到正常推进的进度条。
内容的提问来源于stack exchange,提问作者Simd
相关产品推荐
相关产品推荐

