From ActiveState Recipes. “Probably the fastest memoization decorator in the world”
Python code:
#coding:utf-8
from time import time
def memofunc(f):
""" Memoization decorator for a function taking one argument"""
class MemoDict(dict):
def __missing__(self, key):
ret = self[key] = f(key)
return ret
return MemoDict().__getitem__
def memoize(f):
""" Memoization decorator for a function taking several argument"""
class MemoDict(dict):
def __getitem__(self, *key):
return dict.__getitem__(self, key)
def __missing__(self, key):
ret = self[key] = f(*key)
return ret
return MemoDict().__getitem__
if __name__ == '__main__':
loops = 10**6
def square(x):
return x**2
@memofunc
def m_square(x):
return x**2
start_time = time()
for i in xrange(loops):
square(10)
end_time = time()
print 'Total run time of square with', loops, 'times is', \
(end_time - start_time)
start_time = time()
for i in xrange(loops):
m_square(10)
end_time = time()
print 'Total run time of m_square with', loops, 'times is', \
(end_time - start_time)
def add(x, y):
return x + y
@memoize
def m_add(x, y):
return x + y
start_time = time()
for i in xrange(loops):
add(120, 12)
end_time = time()
print 'Total run time of add with', loops, 'times is', \
(end_time - start_time)
start_time = time()
for i in xrange(loops):
m_add(120, 12)
end_time = time()
print 'Total run time of m_add with', loops, 'times is', \
(end_time - start_time)
Result:
Total run time of square with 1000000 times is 0.209908008575
Total run time of m_square with 1000000 times is 0.0916221141815
Total run time of add with 1000000 times is 0.20007109642
Total run time of m_add with 1000000 times is 0.522424936295
m_add居然要比add还慢!可能是tuple作为dict key时效率不高吧?有待验证。