2015-08-10 5 views
1

Предположим, у меня есть сложная математическая функция со многими входными параметрами P = [p1, ..., pn]. Предположим, что я могу профакторизовать функцию в блоках, например:оптимизация оценки функций кеширование частичного результата

f(P) = f1(p1, p2) * f2(p2, ... pn) 

и, возможно,

f2(p2, ..., pn) = p2 * f3(p4) + f4(p5, ..., pn) 

предположим, что я должен оценить f для многих значения P, например, я хочу найти минимум f. Предположим, что я уже вычислил f(P), и мне нужно вычислить f(P'), где P' равно P, за исключением p1. В этом случае мне не нужно пересчитывать f2, f3, f4, но только f1.

Есть ли библиотека, которая поможет мне реализовать такую ​​систему кеширования? Я знаю RooFit, но он ориентирован на статистическую модель, сделанную блоками. Я ищу что-то более общее. scipy/scikits и т. д., но и библиотеки C++ в порядке. Имеет ли эта техника имя?

+0

Почему бы не использовать отображение (словарь)? –

+0

Вы используете Python 2 или 3? – Cyphase

+0

@ReutSharabani: Мне хотелось бы что-то более выразительное и автоматическое. –

ответ

4

Если вы можете написать эти функции как чистые функции (это означает, что они всегда возвращают одно и то же значение для тех же аргументов и не имеют побочных эффектов), вы можете использовать memoization, который является методом сохранения результатов функции звонки.

try: 
    from functools import lru_cache # Python 3.2+ 
except ImportError: # Python 2 
    # Python 2 and Python 3.0-3.1 
    # Requires the third-party functools32 package 
    from functools32 import lru_cache 

@lru_cache(maxsize=None) 
def f(arg): 
    # expensive operations 
    return result 

x = f('arg that will take 10 seconds') # takes 10 seconds 
y = f('arg that will take 10 seconds') # virtually instant 

Для иллюстрации, или если вы не хотите использовать functools32 на Python 3.2 <:

def memoize(func): 
    memo = {} 

    def wrapper(*args): 
     if args not in memo:    
      memo[args] = func(*args) 
     return memo[args] 

    return helper 

@memoize 
def f(arg): 
    # expensive operations 
    return result 

x = f('arg that will take 10 seconds') # takes 10 seconds 
y = f('arg that will take 10 seconds') # virtually instant 

 Смежные вопросы

  • Нет связанных вопросов^_^