在一个大的文件集合中循环并保存数据图的最快/最有效的方法是什么?

2024-09-28 05:20:14 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我有一个程序,在2000多个数据文件中循环,执行傅立叶变换,绘制变换图,然后保存图形。感觉程序运行的时间越长,似乎越慢。有没有什么方法可以让它运行得更快或更干净,只需在下面的代码中做一个简单的更改?在

以前,我把fourier变换定义为一个函数,但是我在这里读到python有很高的函数调用开销,所以我去掉了这个函数,现在直接运行。另外,我读到clf()有一个稳定的记录,如果你循环许多图,这些图会变得很大,并且会减慢过程,所以我把它改为close()。这些好的变化在哪里?在

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

Tags: 函数fromimport程序fftclose数据文件dt
3条回答

是的,加上近距离是个不错的选择。它应该有助于弥补你的内存泄漏。我还建议将figure、plotting和close命令移到循环之外-只需更新plot创建的Line2D实例。查看this了解更多信息。在

注意:我觉得这个应该有用,但我还没有在这里测试过。在

我测试了与ipython中类似的东西,我注意到当目录中有很多文件时,循环变得相当慢。该目录中的文件系统似乎存在与该文件夹中的文件数有关的开销,可能与以下内容的查找时间有关:

loadtxt(filename, unpack = true)

你可以试着把你的文件列表分成小块,然后保存在不同的目录中。在

您是否考虑过使用multiprocessing模块来并行处理这些文件?假设这里实际上是CPU限制的(意味着fourier变换占用了大部分运行时间,而不是读/写文件),这样可以加快执行时间,而实际上不需要加速循环本身。在

编辑:

例如,类似这样的东西(未经测试,但应该会给你一个想法):

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部分可能不会对您有多大帮助(甚至会伤害您)。在

相关问题 更多 >

    热门问题