2017-10-13 2 views
0

의의 미리 계산/캐싱 부품 (단지 더미 예입니다)의 파이썬에서 다음 함수를 생각해 보자 :이 기능은 다른 x 값 만에 주요 코드 내부에 여러 번이라고파이썬 : 기능

from math import factorial 

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

param과 같은 값을가집니다. 그러나 param의 값은 임의적이며 미리 알 수 없습니다.

첫 번째 함수 호출시 init의 값을 사전 계산하거나 캐시하여 모든 함수 호출에서 다시 계산할 필요가 없도록하려면 어떻게해야합니까?

답변

2

:이 프로그램과 세트 PARAM을 실행할 때 다음, 당신이 다음과 같은 속성으로 초기화와 클래스와 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

param의 기본값을 전역 변수로 설정할 수 있습니다. 당신은 functools에서 lru_cache을 사용할 수 있습니다

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__ 
1

값을 변경 팩토리얼 호출의 결과를 캐시한다. 다음 예제는 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