天天看點

python提高檔案讀取速度_提高從二進制檔案讀取和轉換的速度?

我知道以前有一些關于檔案讀取、二進制資料處理和使用struct進行整數轉換的問題,是以我來這裡詢問一段代碼,我認為這段代碼運作時間太長了。正在讀取的檔案是一個多通道資料樣本記錄(短整數),其中包含資料間隔(是以是嵌套的for語句)。代碼如下:# channel_content is a dictionary, channel_content[channel]['nsamples'] is a string

for rec in xrange(number_of_intervals)):

for channel in channel_names:

channel_content[channel]['recording'].extend(

[struct.unpack( "h", f.read(2))[0]

for iteration in xrange(int(channel_content[channel]['nsamples']))])

有了這段代碼,我每兆位元組讀取2.2秒,雙核記憶體為2 Mb,我的檔案通常有20+Mb,這會帶來一些非常煩人的延遲(特别是考慮到另一個基準共享軟體程式,我正試圖以更快的速度鏡像加載檔案)。

我想知道的是:如果有一些違反“良好實踐”的情況:排列不好的循環、重複操作所需時間超過必要時間、使用效率低下的容器類型(字典?)等等

如果這個讀取速度是正常的,或者對于Python是正常的,并且如果讀取速度

如果建立C++編譯擴充可能會提高性能,如果它是推薦的方法。

(當然)如果有人建議對此代碼進行一些修改,最好是基于以前類似操作的經驗。

謝謝你的閱讀

(我已經釋出了一些關于我這項工作的問題,我希望它們在概念上都不相關,我也希望不要太重複。)

Edit:channel_names是一個清單,是以我做了@eumiro建議的更正(删除鍵入的括号)

編輯:我現在同意塞巴斯蒂安的建議,将array與fromfile()方法一起使用,并很快将最終代碼放在這裡。此外,每一個貢獻對我都非常有用,我非常高興地感謝每一個善意的回答。

使用array.fromfile()一次,然後通過切片大數組為每個通道交替擴充一個數組後的最終形式:fullsamples = array('h')

fullsamples.fromfile(f, os.path.getsize(f.filename)/fullsamples.itemsize - f.tell())

position = 0

for rec in xrange(int(self.header['nrecs'])):

for channel in self.channel_labels:

samples = int(self.channel_content[channel]['nsamples'])

self.channel_content[channel]['recording'].extend(

fullsamples[position:position+samples])

position += samples

每次讀取一點檔案,或者以任何形式使用struct,速度的提高都令人印象深刻。