2013-02-07 3 views
1

필자는 함수를 피클하려고 할 때 fibonacci 안에 메모 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 
+2

기능 및 클래스가 "어떻게 사용 되는가"에 대한 [documentation] (http://docs.python.org/2/library/pickle.html#what-can-be-pickled-and-unpickled) 절인 ". "(built-in과 user-defined) 함수는 값이 아닌"fully qualified "네임 참조에 의해 절름니다. 이것은 함수가 정의 된 모듈의 이름과 함께 함수 이름 만 절인된다는 것을 의미합니다. 함수의 코드 나 그 함수 속성은 절대로 절식되지 않습니다. 따라서 정의 모듈은 unpickle 환경에서 가져올 수 있어야하며 모듈에는 명명 된 객체 " – Bakuriu

답변

8

당신은 부당한 이득을 중첩하지 않고 버전을 제공 실행 사이의 memo 사전을 청소하지 마십시오. 처음으로 timeit을 실행하면 fib이 실행되고 memo dict를 채운 다음 후속 실행에서 다시 사용합니다.

중첩 된 함수는 매번 새 memo 빈을 설정합니다.

+0

duh! 정말 고마워! – prafulfillment

관련 문제