【发布时间】:2012-01-02 11:20:57
【问题描述】:
考虑以下函数:
def fact1(n):
if n < 2:
return 1
else:
return n * fact1(n-1)
def fact2(n):
if n < 2:
return 1
return n * fact2(n-1)
它们应该是等价的。但存在性能差异:
>>> T(lambda : fact1(1)).repeat(number=10000000)
[2.5754408836364746, 2.5710129737854004, 2.5678811073303223]
>>> T(lambda : fact2(1)).repeat(number=10000000)
[2.8432059288024902, 2.834425926208496, 2.8364310264587402]
没有else 的版本慢了10%。这是相当重要的。为什么?
【问题讨论】:
-
你做了多少次测试?
-
@M4tt4n 呃...
.repeat(number=10000000)。 @Cat Plus Plus 是的,但是找出事情为什么会这样运作很有趣,对吧? -
@GabiPurcaru:如果它导致专注于微优化,则不会。这是不健康的,完全是浪费时间。我真的不知道为什么人们会赞成这样的问题。
-
@GabiPurcaru 我赞成这类问题,因为它们奖励那些真正想了解他们的代码实际作用的人。研究时间差异和代码生成的人通常最终对语言有深刻的理解。
-
@CatPlusPlus 我真的不知道为什么人们会否决这样的问题。
标签: python performance recursion