2017-10-13 63 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__