Я надеюсь, что вы можете помочь с импровизацией моего кода. Я определяю функцию, которая выводит элементы определенной массы, один за другим, из распределения, ограниченного функцией 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)