日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python二进制文件 删除尾部数据_在Python中读取和切片二进制数据文件的最快方法...

發布時間:2024/7/23 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python二进制文件 删除尾部数据_在Python中读取和切片二进制数据文件的最快方法... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我有一個處理腳本,用于提取“uint16”類型的二進制數據文件,并一次以6400塊的形式進行各種處理.該代碼最初是用Matlab編寫的,但由于分析代碼是用 Python編寫的,我們希望通過在Python中完成所有工作來簡化流程.問題是我注意到我的Python代碼比Matlab的fread函數慢得多.

簡單地說,Matlab代碼是這樣的:

fid = fopen(filename);

frame = reshape(fread(fid,80*80,'uint16'),80,80);

雖然我的Python代碼很簡單:

with open(filename, 'rb') as f:

frame = np.array(unpack("H"*6400, f.read(12800))).reshape(80, 80).astype('float64')

文件大小從500 MB變化很大 – > 400 GB所以我相信找到一種更快的方法來解析Python中的數據可以為較大的文件帶來好處. 500 MB通常具有~50000個塊,并且該數量隨文件大小線性增加.我看到的速度差異大致是:

Python = 4 x 10^-4 seconds / chunk

Matlab = 6.5 x 10^-5 seconds / chunk

處理顯示隨著時間的推移,Matlab比我實現的Python方法快約5倍.我已經探索了諸如numpy.fromfile和numpy.memmap之類的方法,但是因為這些方法需要在某些時候將整個文件打開到內存中,所以它限制了用例,因為我的二進制文件非常大.有沒有一些pythonic方法可以做到這一點,我錯過了?我本以為Python在打開閱讀二進制文件方面會非常快.任何意見是極大的贊賞.

最佳答案 將塊寫入文件:

In [117]: dat = np.random.randint(0,1028,80*80).astype(np.uint16)

In [118]: dat.tofile('test.dat')

In [119]: dat

Out[119]: array([266, 776, 458, ..., 519, 38, 840], dtype=uint16)

按您的方式導入:

In [120]: import struct

In [121]: with open('test.dat','rb') as f:

...: frame = np.array(struct.unpack("H"*6400,f.read(12800)))

...:

In [122]: frame

Out[122]: array([266, 776, 458, ..., 519, 38, 840])

使用fromfile導入

In [124]: np.fromfile('test.dat',count=6400,dtype=np.uint16)

Out[124]: array([266, 776, 458, ..., 519, 38, 840], dtype=uint16)

比較時間:

In [125]: %%timeit

...: with open('test.dat','rb') as f:

...: ...: frame = np.array(struct.unpack("H"*6400,f.read(12800)))

...:

1000 loops, best of 3: 898 μs per loop

In [126]: timeit np.fromfile('test.dat',count=6400,dtype=np.uint16)

The slowest run took 5.41 times longe....

10000 loops, best of 3: 36.6 μs per loop

fromfile要快得多.

沒有np.array的struct.unpack的時間是266μs;僅僅是f.read,23.所以它是unpack加上更通用和更健壯的np.array需要更長的時間.文件讀取本身不是問題. (np.array可以處理多種輸入,列表列表,對象列表等,因此必須花費更多時間來解析和評估輸入.)

fromfile上稍微快一點的變體是你的讀取加上frombuffer:

In [133]: with open('test.dat','rb') as f:

...: frame3 = np.frombuffer(f.read(12800),dtype=np.uint16)

總結

以上是生活随笔為你收集整理的python二进制文件 删除尾部数据_在Python中读取和切片二进制数据文件的最快方法...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。