所以我有这个程序循环大约2000多个数据文件,执行傅里叶变换,绘制变换,然后保存图形。感觉程序运行的时间越长,它看起来就越慢。无论如何,通过下面代码的简单更改,它可以让它运行得更快或更干净吗?
以前,我将傅立叶变换定义为函数,但我在这里读到python具有高函数调用开销,所以我取消了函数并且现在直接运行。另外,我读到clf()
有一个稳定的先前数据记录,如果你循环了很多情节,这个数字会变得非常大并且会减慢这个过程,因此我将其更改为{{1} }。这些好的变化在哪里呢?
close()
答案 0 :(得分:4)
您是否考虑过使用multiprocessing
模块并行处理文件?假设你在这里实际上是CPU绑定的(这意味着它是耗费大部分运行时间的傅里叶变换,而不是读/写文件),这应该加快执行时间,而不需要加速循环本身。 / p>
修改强>
例如,类似这样的事情(未经测试,但应该给你一个想法):
def do_transformation(filename)
t,f = loadtxt(filename, unpack=True)
dt = t[1]-t[0]
fou = absolute(fft.fft(f))
frq = absolute(fft.fftfreq(len(t),dt))
ymax = median(fou)*30
figure(figsize=(15,7))
plot(frq,fou,'k')
xlim(0,400)
ylim(0,ymax)
iname = filename.replace('.dat','.png')
savefig(iname,dpi=80)
close()
pool = multiprocessing.Pool(multiprocessing.cpu_count())
for filename in filelist:
pool.apply_async(do_transformation, (filename,))
pool.close()
pool.join()
您可能需要调整工作进程中实际完成的工作。例如,尝试并行化磁盘I / O部分可能对你没什么帮助(甚至伤害你)。
答案 1 :(得分:1)
是的,加上关闭是一个很好的举措。它应该有助于堵塞你的内存泄漏。我还建议在循环外移动图形,绘图和关闭命令 - 只需更新由plot创建的Line2D实例。查看this了解详情。
注意:我认为这应该有用,但我还没有在这里测试过。
答案 2 :(得分:0)
我测试了类似于你在ipython中所做的事情,我注意到当一个目录中有很多文件时,循环变得相当慢。看起来该目录中的文件系统有与该文件夹中的文件数相关的开销,可能与查找时间有关:
loadtxt(filename, unpack = true)
您可以尝试通过将文件列表拆分为较小的块并将其保存在每个目录的不同目录中来拆分将图表保存到块中的位置。