Python Scipy-仅当函数输入值更改时才执行函数的一部分

Python Scipy-仅当函数输入值更改时才执行函数的一部分,python,numpy,scipy,Python,Numpy,Scipy,我一直在尝试优化此代码: def spectra(mE, a): pdf = lambda E: np.exp(-(a+1)*E/mE)*(((a+1)*E/mE)**(a+1))/(scipy.special.gamma(a+1)*E) u=[] n=np.random.uniform() E=np.arange(0.01,150, 0.1) for i in E: u.append(scipy.integrate.quad(pdf,0

我一直在尝试优化此代码:

def spectra(mE, a):
    pdf = lambda E: np.exp(-(a+1)*E/mE)*(((a+1)*E/mE)**(a+1))/(scipy.special.gamma(a+1)*E)
    u=[]
    n=np.random.uniform()
    E=np.arange(0.01,150, 0.1)
    for i in E: 
        u.append(scipy.integrate.quad(pdf,0,i)[0])

    f=interp1d(u, E)
    return f(n)
我试图用
f
创建一个查找表,但似乎每次调用该函数时,它都会重新进行集成。有没有一种方法可以放入类似if语句的内容,让我为
me
a
的值创建一次
f
,然后再调用它

谢谢你的帮助


干杯。

听起来,如果使用相同的
(mE,a)
值重新调用函数,您需要返回一个已知值,如果输入是新的,则执行计算


这就是所谓的回忆录。例如,见。请注意,在Python的现代版本中,您可以创建一个装饰器来应用函数的记忆,这会让您更加整洁。

很可能您无法存储光谱(x,y)的值,并通过浮点x和y的精确值合理地检索它们。在现实生活中,很少会遇到完全相同的浮点值

请注意,我不认为您可以直接缓存
f
,因为它依赖于一长串浮点。它的可能输入空间如此之大,以至于我似乎不太可能找到一个接近的匹配项

如果缓存
spectra()
的值,则可以以合理的概率检索足够接近的一对参数的值

问题在于寻找如此紧密的配对。哈希表不能工作(我们需要不精确的匹配),有序列表和二进制搜索也不能工作(我们有两个维度)。我会用一个或其他形式的。您可以动态地构建它,并高效地搜索给定点附近最近的已知点

如果发现缓存的点非常接近所需的点,则可以返回缓存的值。如果没有足够接近的点,则将其添加到索引中,希望将来可以重用它。如果你的点在附近的两个已知点之间,你甚至可以进行插值

当然,最大的先决条件是缓存中有足够数量的点有机会被重用。要估计这一点,请运行一些计算并将
(mE,a)
对存储在某个位置(例如在文件中),然后绘制它们。您将立即看到是否有一组点彼此靠近。当然,您也可以在不进行打印的情况下查找紧密簇。如果您有足够多的紧密集群(可以将一个点的值重新用于另一个点),那么缓存将正常工作。如果没有,就不要费心去实现它