Как я могу импровизировать скорость, пока l oop? - PullRequest
0 голосов
/ 28 апреля 2020

Я надеюсь, что вы можете помочь с импровизацией моего кода. Я определяю функцию, которая выводит элементы определенной массы, один за другим, из распределения, ограниченного функцией imf, пока я не израсходую всю массу, данную функции. Код занимает очень много времени от 1 минуты до 45 минут в зависимости от массы ввода. Мне интересно, есть ли способ сделать этот код более эффективным? Любая помощь будет принята с благодарностью!

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)
...