[英]What is the fastest/most efficient way to loop through a large collection of files and save a plot of the data?
因此,我有一個程序,該程序循環遍歷約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()
您是否考慮過使用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部分可能對您沒有多大幫助(甚至傷害您)。
是的,增加收盤價是不錯的選擇。 它應該有助於解決您的內存泄漏問題。 我還建議將圖形,繪圖和關閉命令移出循環-只需更新由plot創建的Line2D實例即可。 查看此以獲取更多信息。
注意:我認為這應該可行,但是我還沒有在這里進行測試。
我測試了與您在ipython中所做的類似的事情,並且我注意到當目錄中包含很多文件時,循環變得相當慢。 該目錄中的文件系統似乎具有與該文件夾中的文件數有關的開銷,可能與以下內容的查找時間有關:
loadtxt(filename, unpack = true)
您可以嘗試通過將文件列表分成較小的塊,然后將每個塊保存在不同的目錄中,在將圖保存為塊的位置進行拆分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.