Python是否会在一个公式中多次重复计算函数的值?

3
在Python中,如果我有一个函数:
f(x)=(g(x)+1)(g(x))
其中g(x)在之前已经定义,需要花费时间计算。
类似于这样的东西。
def g(x):
  return value
def f(x):
  return (g(x)+1)*(g(x))

在计算f(x)的时候,当把g(x)代入公式中时,Python会计算两次g(x)吗?如果确实计算了两次,人们通常如何处理这个问题?


1
你可以通过在 g 函数内部添加一个 print 调用来轻松自行查找此内容。 - Daniel Roseman
1
{btsdaf} - dabadaba
如果您想让函数g更像数学函数,您可以使用记忆化技术。 - dcg
4个回答

4

根据函数 g(x) 的功能,每次调用它时都会重新计算。而使用记忆化的函数(维基百科)只需要为给定的 x 值计算一次值。例如:

def g(x):
    if cache[x]:
        return cache[x]
    else:
        result = # calculate g(x)
        cache[x] = result
        return cache[x] # or return result

1
应该对calculate g(x)进行注释。 - dcg
编辑以添加注释 - ividito
这个想法是可以理解的,但是由于无限递归的原因,你需要以不同的方式计算值(例如 cache[x] = _g(x),其中 _g 是原始函数)。 - dcg
修改以避免在g(x)上发生递归。 - ividito

0
当将g(x)代入方程式时,Python会计算g(x)两次吗?
  return:(g(x)+1) * (g(x))
          ^^^        ^^^

是的。由于该函数被调用两次,它将被计算两次。

人们通常在Python中如何处理它

您可以调用该函数并将值存储以供稍后使用。

def f(x):
   value_g = g(x)
   return (value_g+1) * (value_g)

@dabadaba : Edited - Kaushik NP

0

检查很容易 - 在g中打印一些内容,看它被打印了多少次。
无论如何,是的。它会调用两次g
我知道处理它的最好方法是创建一个等于该方法返回值的局部变量,然后使用它。

def f(x):
    g_result = g(x)
    return (g_result + 1) * g_result

0

我觉得你的问题的第一部分已经得到了很好的回答,但是关于:

人们通常如何在Python中处理它?

如果从function g(x)的输出需要两次使用,那么将其存储在一个variable中是有意义的(至少对我来说)。由于function应该如何工作的性质(没有像time这样的global影响),相同的input应该始终给出相同的output

所以假设这个function需要1分钟才能计算,如果我们想要两次使用输出,那么调用两次就不合理了,因为现在需要2分钟。如上所述,您可以使用记忆化或简单地将g(x)的输出存储在variable中。

例如:

def f(x):
   gx = g(x)
   return: (gx+1) * gx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接