2016-04-25 137 views
2

我有一個核心函數,我從腳本中的許多其他函數調用。問題是我不希望每個函數調用核心函數來運行它。有沒有一種方法來存儲核心函數的輸出,以便在第二次,第三次調用它時不會運行?python在其他函數中使用一個函數的輸出而不調用所有其他函數

E.g. FUNC2呼籲後,在這裏

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 

等。

FUNC3會再打電話core_func。我怎樣才能防止這一點,但同時使用core_func輸出?一個可能的解決方案可能會返回來自func2的輸出並在func3中使用(但這會變得有點難看)。

感謝

回答

6
variable = core_func(arguments) 

func2(variable) 

func3(variable) 

保存函數的變量的結果!

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

修飾器用一個可調用的可調用函數包裝一個函數,該函數可以將 保存爲maxsize最近的調用。當使用相同的參數週期性地調用昂貴的 或I/O綁定函數時,它可以節省時間。

from functools import lru_cache 

@lru_cache(maxsize=32) 
def core_func(a, b, c): 
    do something.... 
    return x,y,z 
+1

這個答案會更好,如果你表現出一個實際的例子 –

+0

@BryanOakley做,只是增加了實例和一個更好的解釋。感謝您的反饋。 – danielfranca

+0

永遠不知道你可以做到這一點。如果你的函數有很大的開銷,那很酷。 – cal97g