【问题标题】:Simpson's Rule Takes Forever to Run in Python辛普森法则永远在 Python 中运行
【发布时间】:2019-03-13 17:57:51
【问题描述】:

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

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')

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

【问题讨论】:

  • 你有没有尝试过分析,看看大部分时间是什么?
  • 嗨迈克尔,你可能想把这个 Q 放到下面:codereview.stackexchange.com
  • 如果你是出于“严肃”的目的而不是自学 Python,你应该使用 SciPy 而不是自己编写。他们的实现使用 NumPy 数组,速度会更快。

标签: python python-3.x integral simpsons-rule


【解决方案1】:

正如上面提到的 cmets 之一,分析代码将向您展示减速。也许nDeriv 很慢。如果您没有分析工具,您可以在每个代码段周围放置time() 调用并打印结果。更多信息在这里:Measure time elapsed in Python?

因此,如果减速最终出现在您的 for 循环中,您可以尝试以下几件事:

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

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

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

  1. 不要重新计算循环中不变的内容。例如,x / 3 将在每次循环迭代时重新计算,但它永远不会改变。在循环开始之前执行此操作。

同样,您在每次循环迭代中执行两次2 * i

  1. 加法比乘法快。 func 参数可以重写为:

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

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

  1. 这可能是显而易见的,但如果func() 难以计算,这个函数将呈指数级增长。

Python 可能会为您做很多更简单的优化,所以这些可能无济于事,只是想分享一些想法。

【讨论】:

    猜你喜欢
    • 2021-04-19
    • 2020-02-26
    • 2018-08-18
    • 2016-01-12
    • 2016-05-05
    • 1970-01-01
    • 2018-05-26
    • 2018-11-01
    • 2014-12-17
    相关资源
    最近更新 更多