gpt4 book ai didi

python - 辛普森法则在 Python 中需要永远运行

转载 作者:太空宇宙 更新时间:2023-11-03 21:42:52 24 4
gpt4 key购买 nike

我编写了以下函数,用于根据辛普森法则估计函数的定积分:

def fnInt(func, a, b):
if callable(func) and type(a) in [float] and type(b) in [float]:
if a > b:
return -1 * fnInt(func, b, a)
else:
y1 = nDeriv(func)
y2 = nDeriv(y1)
y3 = nDeriv(y2)
y4 = nDeriv(y3)
f = lambda t: abs(y4(t))
k = f(max(f, a, b))
n = ((1 / 0.00001) * k * (b - a) ** 5 / 180) ** 0.25
if n > 0:
n = math.ceil(n) if math.ceil(n) % 2 == 0 else math.ceil(n) + 1
else:
n = 2
x = (b - a) / n
ans = 0
for i in range(int((n - 4) / 2 + 1)):
ans += (x / 3) * (4 * func(a + x * (2 * i + 1)) + 2 * func(a + x * (2 * i + 2)))
ans += (x / 3) * (func(a) + 4 * func(a + x * (n - 1)) + func(b))
return ans
else:
raise TypeError('Data Type Error')

但是,每当我尝试使用此函数时,似乎都需要很长时间才能产生输出。有没有办法可以重写这段代码以减少时间?

最佳答案

正如所提到的评论之一,分析代码将向您显示速度减慢的情况。也许 nDeriv 很慢。如果您没有分析工具,您可以在每个代码部分调用 time() 调用并打印结果。更多信息请点击:Measure time elapsed in Python?

因此,如果速度减慢最终出现在您的 for 循环中,您可以尝试以下一些操作:

  1. Python 可能会在每次迭代时计算循环条件:

    for i in range(int((n - 4)/2 + 1)):

在循环之前计算int((n - 4)/2 + 1)一次。

  • 不要重新计算循环内未更改的内容。例如,x/3 将在每次循环迭代时重新计算,但它永远不会改变。在循环开始之前执行此操作。
  • 同样,每次循环迭代都会执行两次 2 * i

  • 加法比乘法更快。 func 参数可以重写为:

    xi = x * i
    a1 = a + xi + xi + x
    a2 = a1 + x

  • 然后更进一步,您还可以重新将 xi 作为累加器。也就是说,从 x = 0 开始,然后每次迭代都只是 x += x

  • 这可能是显而易见的,但如果 func() 难以计算,则该函数将呈指数级缓慢。
  • Python 可能会为你做很多更简单的优化,所以这些可能没有帮助,但只是想分享一些想法。

    关于python - 辛普森法则在 Python 中需要永远运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52712836/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com