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