Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 循环浏览大量文件并保存数据图的最快/最有效的方法是什么?_Python_Matplotlib_Fft_Figure - Fatal编程技术网

Python 循环浏览大量文件并保存数据图的最快/最有效的方法是什么?

Python 循环浏览大量文件并保存数据图的最快/最有效的方法是什么?,python,matplotlib,fft,figure,Python,Matplotlib,Fft,Figure,所以我有一个程序,它在大约2000多个数据文件中循环,执行傅里叶变换,绘制变换,然后保存图形。感觉程序运行的时间越长,速度似乎越慢。通过对下面的代码进行简单的更改,是否可以使它运行得更快或更干净 以前,我将傅里叶变换定义为函数,但我在这里的某个地方读到python有很高的函数调用开销,所以我取消了函数,现在直接运行。此外,我还了解到,clf()有一个稳定的先前数据日志,如果你在很多图中循环,这些数据可能会变得相当大,并减慢过程,因此我将其更改为close()。这些好的变化也在哪里 from nu

所以我有一个程序,它在大约2000多个数据文件中循环,执行傅里叶变换,绘制变换,然后保存图形。感觉程序运行的时间越长,速度似乎越慢。通过对下面的代码进行简单的更改,是否可以使它运行得更快或更干净

以前,我将傅里叶变换定义为函数,但我在这里的某个地方读到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()

是的,增加收盘价是一个很好的举措。它应该有助于堵塞内存泄漏。我还建议将figure、plotting和close命令移到循环之外-只需更新plot创建的Line2D实例。查看更多信息


注意:我认为这应该有效,但我还没有在这里测试它。

是的,添加close是一个很好的操作。它应该有助于堵塞内存泄漏。我还建议将figure、plotting和close命令移到循环之外-只需更新plot创建的Line2D实例。查看更多信息


注意:我认为这应该可以,但我还没有在这里测试它。

您考虑过使用
多处理模块来并行处理文件吗?假设您实际上是CPU受限的(这意味着傅里叶变换占用了大部分运行时间,而不是读取/写入文件),那么应该可以加快执行时间,而不需要实际加快循环本身

编辑:

例如,类似这样的内容(未经测试,但应该给您一个想法):


您可能需要调整工作进程中实际完成的工作。例如,尝试并行化磁盘I/O部分可能不会对您有多大帮助(甚至伤害您)。

您是否考虑过使用
多处理模块来并行化处理文件?假设您实际上是CPU受限的(这意味着傅里叶变换占用了大部分运行时间,而不是读取/写入文件),那么应该可以加快执行时间,而不需要实际加快循环本身

编辑:

例如,类似这样的内容(未经测试,但应该给您一个想法):


您可能需要调整工作进程中实际完成的工作。例如,尝试并行化磁盘I/O部分可能不会对您有多大帮助(甚至会伤害您)。

我测试了一些类似于您在ipython中所做的事情,我注意到当目录中有大量文件时,循环会变得相当慢。该目录中的文件系统的开销似乎与该文件夹中的文件数有关,可能与以下文件的查找时间有关:

loadtxt(filename, unpack = true)

您可以尝试将文件列表拆分为较小的块,并将每个块保存在不同的目录中,从而将绘图拆分为chunck

我测试了一些类似于您在ipython中所做的事情,我注意到当目录中有很多文件时,循环会变得相当慢。该目录中的文件系统的开销似乎与该文件夹中的文件数有关,可能与以下文件的查找时间有关:

loadtxt(filename, unpack = true)

您可以尝试将文件列表拆分为较小的块,并将每个块保存在不同的目录中,从而将绘图拆分为chunck

在这种情况下,Python的开销将是微不足道的-您的大部分时间将花费在numpy/pylab调用上-这将委托给高效的低级代码-这似乎只是您正在执行的昂贵操作的一个例子。这与您的问题没有直接关系,但一般来说,从导入中执行
*
不是一个好主意。这使得您很难判断正在调用的函数的定义位置,并且可能会导致您不知道的函数名之间的冲突。@Lattyware是的,这些文件的大小都不尽相同,从几Mb到几十Mb不等,因此傅里叶变换可能非常密集。我只是不确定更改一些绘图函数是否有帮助。@dano哦,是的,别担心,我的代码中没有这样做。键入它比写出我导入的每个函数都要容易:)而且
pylab
是个坏主意,直接从
numpy
matplotlib.pyplot
导入(对于脚本来说
pyplot
不是个好主意,直接使用OO接口),Python的开销将是微不足道的-您的绝大多数时间将花费在numpy/pylab调用上-这将委托给高效的低级代码-这似乎只是您正在执行的昂贵操作的一个例子。这与您的问题没有直接关系,但一般来说,从导入中执行
*
不是一个好主意。这使得您很难判断正在调用的函数的定义位置,并且可能会导致您不知道的函数名之间的冲突。@Lattyware是的,这些文件的大小都不尽相同,从几Mb到几十Mb不等,因此傅里叶变换可能非常密集。我只是不确定更改一些绘图函数是否有帮助。@dano哦,是的,别担心,我的代码中没有这样做。键入它比写出我导入的每个函数都要容易:)而且
pylab
是个坏主意,直接从
numpy
matplotlib.pyplot
导入(对于脚本来说
pyplot
不是个好主意,直接使用OO接口)。hmmmm。