python - 遍历大量文件并保存数据图的最快/最有效的方法是什么?

标签 python matplotlib fft figure

所以我有这个程序循环遍历大约 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/

相关文章:

python - 每 4 个字符插入一次

python - 如何在列表中的某些位置\n

python - python中的e.printStackTrace等价物

python - 如何使用 Django 的 assertJSONEqual 来验证 View 返回 JsonResponse 的响应

python - 即使调整图形大小,如何获得图例和轴之间的恒定距离?

python - Matplotlib迭代设置子图轴大小

python - Matplotlib:对于浮点来说值太小的对数刻度

Matlab:对于偶实函数,FFT复数结果,IFFT实数结果

math - numpy离散连续傅里叶变换

signal-processing - 如何从音频流中检测语音