所以我有这个程序循环遍历大约 2000 多个数据文件,执行傅里叶变换,绘制变换,然后保存图形。感觉程序运行的时间越长,它似乎变得越慢。是否可以通过简单更改以下代码来使其运行得更快或更干净?
之前,我将傅里叶变换定义为一个函数,但我在这里的某个地方读到 python 的函数调用开销很高,所以我取消了该函数,现在直接运行。另外,我读到 clf()
有一个稳定的以前的数据日志,如果你循环遍历很多图,这些数据会变得非常大并减慢进程,所以我把它改为 关闭()
。哪里还有这些好的变化呢?
from numpy import *
from pylab import *
for filename in filelist:
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()
最佳答案
您是否考虑过使用multiprocessing
模块来并行处理文件?假设您实际上在这里受 CPU 限制(这意味着傅里叶变换占用了大部分运行时间,而不是读取/写入文件),这应该会加快执行时间,而实际上不需要加快循环本身。
编辑:
例如,像这样的东西(未经测试,但应该给你想法):
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 部分可能对您没有多大帮助(甚至伤害您)。
关于python - 遍历大量文件并保存数据图的最快/最有效的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23572714/