Skip to main content
 首页 » 编程设计

python之为什么嵌套函数比非嵌套函数慢这么多

2025年05月04日17zhoujg

我试图在斐波那契函数中包含备忘录字典,因为我正在尝试 pickle 函数。然而,在我的测试中,嵌套函数似乎明显更慢,但只有当我使用内存函数时,我才在其他版本的斐波那契中看到这一点。

我所有的测试: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 

请您参考如下方法:

您不会在运行之间清理 memo 字典,从而在不嵌套不公平优势的情况下提供版本。 timeit 第一次运行 fib 时,它将填充 memo 字典,然后后续运行会重新使用它。

嵌套函数每次都会设置一个新的空memo。