我有一个核心函数,我从我的脚本中的许多其他函数调用。问题是我在调用核心函数运行它时不需要每个函数。有没有办法存储核心功能的输出,以便当它被调用第二次,第三次等时它不运行?
E.g。
def core_func(a,b,c):
do something....
return x,y,z
def func2(a,b,c):
x,y,z = core_func(a,b,c)
do something with x,y,z
def func3(a,b,c):
x,y,z = core_func(a,b,c)
do something with x,y,z
等。
在func2调用之后,这里func3会再次调用core_func。我怎样才能防止这种情况但同时使用core_func输出?一个可能的解决方案可能是从func2返回输出并在func3中使用(但这会有点难看)。由于
答案 0 :(得分:6)
variable = core_func(arguments)
func2(variable)
func3(variable)
将函数的结果存储在变量中!
答案 1 :(得分:5)
您可以使用memoize
每次调用函数时都会缓存函数的返回值。
因此,每次使用相同的参数调用函数时,您将获得没有计算时间的返回值
即:
如果你正在使用Python2,你需要实现它,你可以看看它是如何在上面的链接上实现的,然后将它应用到你的函数中:
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 core_func(a, b, c):
do something....
return x,y,z
如果您正在使用Python3,那么您可以使用lru_cache decorator
免费使用它装饰器用一个memoizing callable来包装一个可以节省的函数 到maxsize最近的电话。它可以节省昂贵的时间 或者使用相同的参数定期调用I / O绑定函数。
from functools import lru_cache
@lru_cache(maxsize=32)
def core_func(a, b, c):
do something....
return x,y,z