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

Pythonπ近似值计算代码运行缓慢,求优化方法及原因分析

问题解答

一、当前计算方式的效率问题

你用的是莱布尼茨级数(π/4 = 1 - 1/3 + 1/5 - 1/7 + ...),这个级数的收敛速度极慢:要得到n位有效数字,需要大约10^n次迭代。比如要拿到6-7位精度,得迭代上千万次,这就是你觉得运行慢的核心原因——算法本身的收敛效率太低,不是代码写法的小问题。

二、优化方案

1. 换用收敛更快的级数

直接放弃莱布尼茨级数,改用收敛速度快得多的公式,比如:

  • Machin公式:π/4 = 4arctan(1/5) - arctan(1/239),仅需几次迭代就能得到十几位精度
  • Chudnovsky算法:适合计算高精度π,收敛速度呈指数级,实现稍复杂
  • BBP公式:可直接计算π的第n位,无需先算出前面所有位

Machin公式的简单实现示例:

import math

def calculate_pi():
    return 4 * (4 * math.atan(1/5) - math.atan(1/239))

print(calculate_pi())

这段代码能瞬间输出10位以上精度的π值。

2. 优化莱布尼茨级数的代码写法(若坚持使用)

如果一定要用莱布尼茨级数,可通过消除冗余计算提升速度:

  • 避免每次计算(-1)**i,用一个符号变量交替翻转
  • 避免重复计算i*2+1,用变量递增的方式维护分母
  • 简化浮点数运算步骤

优化后的代码示例:

nx = 0.0
sign = 1
denominator = 1
for _ in range(10000000):
    nx += sign / denominator
    sign *= -1
    denominator += 2

print(nx * 4)

去掉幂运算和重复乘法后,运行速度会比原代码快不少。

3. 用编译工具加速循环

如果需要处理超大规模迭代,可借助Python编译加速工具:

  • NumPy向量化:将循环转为数组运算,利用C级别的执行速度
  • Numba:通过JIT(即时编译)加速函数,无需大幅修改代码
  • Cython:将Python代码编译为C代码,大幅提升循环效率

Numba加速的示例:

from numba import jit

@jit(nopython=True)
def calculate_pi_leibniz(n):
    nx = 0.0
    sign = 1
    denominator = 1
    for _ in range(n):
        nx += sign / denominator
        sign *= -1
        denominator += 2
    return nx * 4

print(calculate_pi_leibniz(10000000))

这个版本的循环速度会比纯Python快几十倍。

4. 提前终止迭代(针对莱布尼茨级数)

莱布尼茨级数的每一项绝对值是1/(2i+1),当这个值小于你需要的精度阈值时,就可以停止迭代。比如要得到6位精度,当1/(2i+1) < 1e-7时即可终止,减少不必要的计算。


内容的提问来源于stack exchange,提问作者maggapgga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 21:55:42