2017-10-13 39 views
0

預先計算/緩存部分讓我們考慮在Python下面的函數(這只是一個虛擬的例子):的Python:的功能

from math import factorial 

def f(x, param): 
    init = factorial(param) 
    return x**param/init 

這個函數被調用的x不同的值,但主要的代碼中多次具有相同的值param。但是,param的值是任意的,並且事先不知道。

如何在第一次函數調用時預先計算或緩存init的值,以便在每次函數調用時都不需要重新計算它的值?

回答

2

您可以使用從functools的lru_cache緩存階乘調用的結果。以下示例從math.factorial創建階乘的自定義緩存版本,

import math 
import functools 

@functools.lru_cache() 
def factorial(n): 
    return math.factorial(n) 

def f(x, param): 
    init = factorial(param) 
    return x**param/init 
1

您可以將參數的默認值設置爲全局變量。然後,當你運行該程序並設置PARAM,只是改變了值

default = 0 
def f(x, param=default): 
    if param==default: 
     init = default_init 
    else: 
     init = factorial(param) 
    return x**param/init 

def main(): 
    global default 
    default=arbitary_value 
    global default_init = factorial(default) 
1

您可以實現使用init類和param的屬性,如下列:

from math import factorial 

class f: 
    def __init__(self, param): 
    self.init = factorial(param) 
    self.param = param 

    def __call__(self, x): 
    return x**self.param/self.init 


a = f(10) # __init__ 

for i in range(10): 
    print(a(i)) # __call__