【问题标题】:Python function unbearably slowPython函数慢得难以忍受
【发布时间】:2019-03-12 16:44:32
【问题描述】:

我正在上一门关于计算物理学的数值方法的课程。 我在下面有这个功能,它工作正常,但在第 12-13 次迭代后变得很慢。 我知道python很慢,但我从来不知道它这么慢。谁能告诉我这么慢的原因?

def fixpt(x0, es, imax):
    g = lambda x: 3 * (x**3) + x - 3 + x
    xr = x0
    x = []
    e = []
    it = []
    for i in range(imax):
        xrold = xr
        xr = g(xrold)
        if xr != 0:
            ea = abs((xr - xrold)/xr)*100
        it.append(i)
        x.append(xr)
        e.append(ea)
        if ea < es:
            break
    return it, x, e

【问题讨论】:

  • python 并不“慢”,它实际上对于大多数任务来说“足够快”。与其他一些语言相比,“慢”只是一个相对术语。通常,当您遇到速度瓶颈时,您需要询问是否有更好的方法来做某事。不要责怪语言,而是优化代码。
  • python 并不慢,你的代码是,你应该写你的函数应该做什么并提供基准
  • 很抱歉没有提到它应该做什么,它基本上是一种称为“定点迭代”的寻根方法。我正在使用它来查找 3*x^3 + x - 3 的根。
  • @RockyLi 不是2x - 3 吗?
  • @ParitoshSingh 是的。

标签: python jupyter


【解决方案1】:

您正在一个非常糟糕的函数中尝试使用pickard 或定点迭代,这会使您的方法发散,因此您的代码很慢。

要么尝试其他方法,要么替换函数。

示例:将 f(x) 替换为 1 / (1 + f(x)) - 1(同根)

def fixpt(x0, es, imax):
    g = lambda x: 1 / (3 * (x**3) + x - 3 + x + 1) - 1

    xr = x0
    x = []
    e = []
    it = []
    for i in range(imax):
        xrold = xr
        xr = g(xrold)
        if xr != 0:
            ea = abs((xr - xrold)/xr)*100
        it.append(i)
        x.append(xr)
        e.append(ea)
        if ea < es:
            break
    return it, x, e

【讨论】:

猜你喜欢
  • 2015-05-10
  • 1970-01-01
  • 1970-01-01
  • 2014-01-09
  • 2018-03-17
  • 2014-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
相关资源
最近更新 更多