对我来说,这听起来像你想要记忆函数,这样当你用已知参数调用它时,它会返回已知响应而不是重做它......这个特定的实现来自http://wiki.python.org/moin/PythonDecoratorLibrary#记忆
虽然这个问题可能有点矫枉过正,但 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)
这应该更快(假设您不关心丢失的重复项)