對我來說,這聽起來像你想memoized功能,這樣,當你與已知的參數來調用它,它會返回已知的反應,而不是重做的......這個特定的實現來自http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize
雖然它可能是輕微的矯枉過正對於這個問題memoize的是要知道
import collections
import functools
class memoized(object):
'''Decorator. Caches a function's return value each time it is called.
If called later with the same arguments, the cached value is returned
(not reevaluated).
'''
def __init__(self, func):
self.func = func
self.cache = {}
def __call__(self, *args):
if not isinstance(args, collections.Hashable):
# uncacheable. a list, for instance.
# better to not cache than blow up.
return self.func(*args)
if args in self.cache:
return self.cache[args]
else:
value = self.func(*args)
self.cache[args] = value
return value
def __repr__(self):
'''Return the function's docstring.'''
return self.func.__doc__
def __get__(self, obj, objtype):
'''Support instance methods.'''
return functools.partial(self.__call__, obj)
@memoized
def get_words(fname):
return list(open(fname, 'r'))
@memoized
def filter(word_list):
filtered_words = []
special_words = [line.strip() for line in get_words("special_words.txt")]
for w in word_list:
if not w in special_words
filtered_words.append(w)
return filtered_words
在一個側面說明一個絕招是
print set(word_list).difference(special_words)
一個非常有用的模式0
它應該快得多(假設你不關心丟失的重複項)
''filter''是一個非常糟糕的函數名稱。已經有一個這樣的名稱內置。 –