我希望你能帮我改进代码。我正在定义一个函数,它从一个受函数imf()约束的分布中逐个提取出某个质量的元素,直到我用完了给这个函数的所有质量。根据输入量,代码需要非常长的时间,从1分钟到45分钟不等。我想知道是否有任何方法使这个代码更有效?在代码中,有一些参数给出了一些琐碎的答案,比如log10(mnorm),这样做是为了确保将来我可以更改参数。我问题的焦点是while循环,以及它是如何从imf()给出的分布中提取的,我已经确定这一部分是代码长性能时间的根源。任何帮助都将不胜感激。
class Mod_MyFunctions:
def __init__(self):
pass
def imf(self, x, imf_type):
# Chabrier (2003) IMF for young clusters plus disk stars: lognorm and power-law tail
mnorm = 1.0
A1 = 0.158
mc = 0.079
sigma = 0.69
A2 = 4.43e-2
x0 = -1.3
if imf_type == 0:
ml = numpy.asarray((x <= log10(mnorm)).nonzero())[0]
mh = numpy.asarray((x > log10(mnorm)).nonzero())[0]
y = numpy.zeros(len(x))
for i in ml: y[i] = A1 * exp(-(x[i] - log10(mc))**2/2./sigma**2)
for i in mh: y[i] = A2 * (10.**x[i])**(x0-1)
return y
def mass_dist(self,
mmin=0.01,
mmax=100,
Mcm=10000,
imf_type=0,
SFE=0.03):
result = []
while sum(10**(np.array(result))) < SFE*Mcm:
x=numpy.random.uniform(log10(mmin), log10(mmax),size=1)
y=numpy.random.uniform(0, 1, size=1)
result.extend(x[numpy.where(y < myf.imf(x, imf_type))])
md=numpy.array(result)
return 10**md, len(md)发布于 2020-04-28 07:48:22
即兴创作的含义和你想的不一样:)
log10(mnorm)似乎只需要计算一次。你可以在脑子里做。是0。
对于log10(mc)也是如此(在你的脑海中,这个不是这样的:)。
当不是零的时候,imf_type似乎是无用的。我不是侏儒主义者,所以,如果imf_type不是零的话,imf()返回什么?
sigma**2也可以计算一次。
log10(mmin)和log10(mmax)可以在每个mass_dist调用中计算一次。
myf.imf(x, imf_type)可以在每个调用中计算一次以进行扩展(或者mass_dist,我不确定该语句意味着什么,但我几乎可以肯定,imf调用至少可以向上移动一个级别)。这个可能是最大的性能杀手。
这种(反)模式可能有更多的例子。
至于算法本身,我留给其他人:)
https://codereview.stackexchange.com/questions/241347
复制相似问题