首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么嵌套函数比非嵌套函数要慢得多?

为什么嵌套函数比非嵌套函数要慢得多?
EN

Stack Overflow用户
提问于 2013-02-08 03:17:34
回答 1查看 152关注 0票数 1

我试图在fibonacci中包含memo dict,因为我试图剔除该函数。然而,在我的测试中,嵌套函数似乎要慢得多,但只有当我使用memoized函数时,我才不会在其他版本的fibonacci中看到这一点。

我的所有测试:https://gist.github.com/dasickis/4733353

代码语言:javascript
运行
复制
#!/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")

输出:

代码语言:javascript
运行
复制
fibonacci
0.263559103012

fibonacci_nested
11.4014730453
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-08 03:20:56

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

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

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14759176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档