我试图在fibonacci中包含memo dict,因为我试图剔除该函数。然而,在我的测试中,嵌套函数似乎要慢得多,但只有当我使用memoized函数时,我才不会在其他版本的fibonacci中看到这一点。
我的所有测试:https://gist.github.com/dasickis/4733353
#!/usr/bin/env python
memo = {0: 0, 1: 1}
# Contract: [int > 0] -> [int > 0]
def fibonacci(n):
""" Return the `x`th number in the fibonacci series. """
if not n in memo:
memo[n] = fibonacci(n - 1) + fibonacci(n - 2)
return memo[n]
#--------------------------#
# Contract: [int > 0] -> [int > 0]
def fibonacci_nested(n):
memo = {0: 0, 1: 1}
def fib(n):
""" Return the `x`th number in the fibonacci series. """
if not n in memo:
memo[n] = fib(n - 1) + fib(n - 2)
return memo[n]
return fib(n)
#--------------------------#
import timeit
stmt = "assert fib(20) == 6765"
print "fibonacci"
print timeit.timeit(stmt, setup="from __main__ import fibonacci as fib")
print
print "fibonacci_nested"
print timeit.timeit(stmt, setup="from __main__ import fibonacci_nested as fib")
输出:
fibonacci
0.263559103012
fibonacci_nested
11.4014730453
发布于 2013-02-08 03:20:56
您不会在两次运行之间清理memo
字典,从而在不嵌套不公平的优势的情况下提供版本。当timeit
第一次运行fib
时,它将填充memo
字典,然后在随后的运行中重用它。
嵌套函数每次都会设置一个新的空memo
。
https://stackoverflow.com/questions/14759176
复制相似问题