首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >年轻星团和盘场恒星的初始质量函数

年轻星团和盘场恒星的初始质量函数
EN

Code Review用户
提问于 2020-04-28 06:30:15
回答 1查看 133关注 0票数 1

我希望你能帮我改进代码。我正在定义一个函数,它从一个受函数imf()约束的分布中逐个提取出某个质量的元素,直到我用完了给这个函数的所有质量。根据输入量,代码需要非常长的时间,从1分钟到45分钟不等。我想知道是否有任何方法使这个代码更有效?在代码中,有一些参数给出了一些琐碎的答案,比如log10(mnorm),这样做是为了确保将来我可以更改参数。我问题的焦点是while循环,以及它是如何从imf()给出的分布中提取的,我已经确定这一部分是代码长性能时间的根源。任何帮助都将不胜感激。

代码语言:javascript
复制
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)
EN

回答 1

Code Review用户

发布于 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调用至少可以向上移动一个级别)。这个可能是最大的性能杀手。

这种(反)模式可能有更多的例子。

至于算法本身,我留给其他人:)

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/241347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档