首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >辛普森规则永远在Python中运行

辛普森规则永远在Python中运行
EN

Stack Overflow用户
提问于 2018-10-09 11:15:22
回答 1查看 145关注 0票数 1

我写了下面的函数,用辛普森法则来估计函数的定积分:

代码语言:javascript
复制
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')

然而,似乎每当我尝试使用此函数时,都需要花费很长时间才能产生输出。有没有办法重写这段代码,以便占用更少的时间?

EN

回答 1

Stack Overflow用户

发布于 2018-10-09 13:15:55

正如其中提到的注释之一,分析代码将向您显示速度减慢。也许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. 加法比乘法快。函数参数可以重写为:

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

再往前走一步,你也可以把xi重做为累加器。也就是说,从x = 0开始,然后每次迭代都是简单的x += x

  1. 这可能是显而易见的,但是如果func()很难计算,这个函数将以指数级的速度变慢。

Python可能会为你做很多更简单的优化,所以这些可能没有帮助,只是想分享一些想法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52712836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档