2016-05-17 16 views
0

Ich habe die Wahrscheinlichkeit Dichte Funktionen func1 und func2 (einschließlich der support von jedem) von zwei Zufallsvariablen. Jetzt muss ich die Wahrscheinlichkeitsdichte in Abhängigkeit von der Summe dieser beiden Zufallsvariablen, die ich über erstellen:Cache dynamisch generierte Funktionen

import numpy as np 
import scipy.integrate 
[...] 
def density_add(func1, func2, support): 
    return np.vectorize(lambda xi: scipy.integrate.simps(func1(support) * func2(xi-support), support)) 

Das Problem mit diesem ist die große Redundanz. Viele Werte müssen mehr als einmal berechnet werden. Also habe ich versucht zu cachen, aber Probleme traten aufgrund der dynamisch generierten Funktionen ohne eindeutige Namen auf.

from joblib import Memory 
mem = Memory(cachedir="/tmp/joblib", verbose=0) 
[...] 
def density_add(func1, func2, support): 
    return np.vectorize(mem.cache(lambda xi: scipy.integrate.simps(func1(support) * func2(xi-support), support)) 


/usr/lib/python3/dist-packages/numpy/lib/function_base.py:2232: JobLibCollisionWarning: Cannot detect name collisions for function '<lambda> [...] 
/usr/lib/python3/dist-packages/numpy/lib/function_base.py:2232: JobLibCollisionWarning: Possible name collisions between functions '<lambda>' [...] 

Was ist ein besserer Ansatz so dynamisch generierte Funktionen cachen?

Antwort

2

Konnten Sie functools.lru_cache verwenden? https://docs.python.org/3/library/functools.html#functools.lru_cache. Es wäre alles im Speicher, also würden Sie zwischen den Neustarts Ihres Programms Werte verlieren, aber der Cache würde sich aufwärmen.

von functools importieren lru_cache

lru_cache als Dekorateur

lru_cache als Funktion

>>> myfunc2 = lru_cache()(lambda x: myfunc(x) *2) 
>>> myfunc2(2) 
sleeping 
6 
>>> myfunc2(2) 
6 
+0

Ja, im Speicher ist kein Problem und 'lru_cache' gut funktioniert. Vielen Dank! – Chickenmarkus

Verwandte Themen