我应该何时将函数的结果存储为python中的变量?

When should I store the result of a function as a variable in python?

假设函数my_list(obj)返回一个列表。 我想编写一个函数,如果此列表的长度为1,则返回my_list(obj)的单个元素,否则返回False。 我的代码是

1
2
3
4
def my_test(obj):
    if len(my_list(obj)) == 1:
        return my_list(obj)[0]
    return False

它刚刚告诉我代码

1
2
3
4
5
def my_test(obj):
    L = my_list(obj)
    if len(L) == 1:
        return L[0]
    return False

可能效率更高,因为它只调用my_list()一次。 这是真的?

函数my_list()可能是计算密集型的,所以我很好奇这两个代码块之间是否存在差异。 我很乐意自己做一个测试,但我不太清楚该怎么做。 我也很好奇,如果函数的结果被多次调用,那么将函数的结果存储为变量通常是更好的做法。


你是对的。第二个块效率更高,因为它只调用my_list()一次。如果my_list()的计算成本不是特别高,那么您根本不会注意到差异。另一方面,如果你知道它会很昂贵,最好将结果保存在可能的地方,如果它不妨碍可读性(但是,请注意@Tchemate对可能异常的内存的回答)。

但是,如果my_list()有副作用,或者它的返回值可能会在这两个调用之间发生变化,您可能不想保存它(取决于您是否要触发副作用两次或需要接收更改的返回值) 。

如果您想自己测试一下,可以像这样使用time.time

1
2
3
4
5
6
7
import time

t0 = time.time()
my_test()
t1 = time.time()

total = t1-t0

获得my_test()的时间。只需运行两个函数并比较它们的时间。


回答你的问题,如果一个函数的结果被多次调用,它是否通常更好地存储函数的结果:它取决于。就可读性而言,作为一名程序员,这完全取决于你。就速度而言,将结果存储在变量中通常比运行两次函数更快。

但是,存储结果可能会使用内存,如果存储的是异常大的变量,则内存使用量实际上会导致比简单调用函数更长的运行时间。此外,如上所述,运行函数不仅可以将结果存储在变量中,因此运行不同次数的函数可以给出不同的结果。