假设函数my_list(obj)
返回一个列表。我想编写一个函数,如果此列表的长度为1,则返回my_list(obj)
的单个元素,否则返回False
。我的代码是
def my_test(obj):
if len(my_list(obj)) == 1:
return my_list(obj)[0]
return False
我突然意识到代码
def my_test(obj):
L = my_list(obj)
if len(L) == 1:
return L[0]
return False
可能效率更高,因为它只调用my_list()
一次。这是真的吗?
函数my_list()
可能是计算密集型的,所以如果这两个代码块之间存在差异,我很好奇。我自己很乐意参加考试,但我不太清楚该怎么做。我也很好奇,如果函数的结果被多次调用,一般来说将函数的结果存储为变量是更好的做法。
答案 0 :(得分:3)
你是对的。第二个块效率更高,因为它只调用my_list()
一次。如果my_list()
的计算成本特别高,那么您根本不会注意到差异。另一方面,如果你知道它会很昂贵,最好将结果保存在尽可能不妨碍可读性的地方(但请注意@Checkmate's answer中有关可能异常的内存的警告)
但是,如果my_list()
有side effects,或者它的返回值可能会在这两次调用之间发生变化,那么您可能不想保存它(取决于您是否要触发副作用两次或需要接收改变的返回值)。
如果您想自己测试一下,可以time.time
使用import time
t0 = time.time()
my_test()
t1 = time.time()
total = t1-t0
:
my_test()
获取{{1}}的时间。只需运行两个函数并比较它们的时间。
答案 1 :(得分:2)
回答你的问题,如果一个函数的结果被多次调用,它是否通常更好地存储函数的结果:它取决于。就可读性而言,作为一名程序员,这完全取决于你。就速度而言,将结果存储在变量中通常比运行函数两次更快。
然而,存储结果可以使用内存,如果存储异常大的变量,则内存使用实际上可以比简单地调用函数更长的运行时间。此外,如上所述,运行函数不仅可以将结果存储在变量中,因此运行不同次数的函数可以给出不同的结果。