0
我试图将多个高斯给定的数据,并在第500个型号达到时,这部分程序是用约3 GB的内存,我需要适应总共〜2000款。下面是我的程序与随机生成的数据,这不会产生非常适合一个到简体版本,但它说明了时间的问题:我无法想出一个办法来优化这个部分,使其Python的配件:优化循环
import sys
sys.setrecursionlimit(5000)
import matplotlib.pyplot as plt
import numpy as np
import random
from random import uniform
x=[random.uniform(2200.,3100.) for p in range(0, 1000)]
y=[random.uniform(1.,1000.) for p in range(0, 1000)]
import sherpa.ui as ui
import numpy as np
ui.load_arrays(1,x,y) # 1 is the first data
d1=ui.get_data()
d1.staterror=0.002*d1.y # define error on y just for plotting purpose, not required for fit
ui.plot_data()
ui.set_stat("leastsq") # leasr square method for fit
ui.set_model(ui.powlaw1d.pow1) # fit powerlaw.. pow1 is the shortcut name
# ui.show_all() will show you all the parameters for the model
pow1.ref=2500
ui.fit()
# fitting templates
x2=[random.uniform(2200.,3100.) for p in range(0, 1000)]
y2=[random.uniform(1.,1000.) for p in range(0, 1000)]
model1="pow1" # initiliaze the model for fitting all the gaussians
sign="+"
sigma=45.
g_pos=x2
g_ampl=[] # we will store the fit value here
ui.freeze(model1) # freeze the powerlaw
for n in range(1,1000): # this excludes the upper limit
ui.create_model_component("gauss1d","g{}".format(n))
ui.set_par("g{}.pos".format(n),x2[n],frozen=True)
ui.set_par("g{}.ampl".format(n),y2[n])
ui.set_par("g{}.fwhm".format(n),sigma,frozen=True)
model1=model1+sign+"g{}".format(n)
if y2[n] == 0.:
g_ampl.append(0.) # list zero amplitude for this model
else:
g=ui.create_model_component("gauss1d","g{}".format(n)) # do this to store g_ampl of this model only
ui.set_source(model1) # overwriting with actual model
ui.fit()
ui.fit()
ui.fit()
g_ampl.append(g.ampl.val)
ui.freeze(model1) # freeze the model and go to the next gaussian
高效且耗时更少。任何想法,以帮助我让它跑得更快,将不胜感激。
您的代码无法运行。您可以编辑您的问题,以确保它包含[最小完整核实的示例](http://stackoverflow.com/help/mcve)?很难理解你想要做什么,甚至不知道你正在使用什么软件包。 –
希望这[链接](https://wiki.python.org/moin/PythonSpeed/PerformanceTips)可以提供帮助。所有我想改变“范围”到“x范围” –
@CurtF。的 首先,我编辑的代码,它可以对随机生成的数据运行(如在程序)。我收录了评论。请让我知道它是否有帮助。 – Phyast10