使用 python 把一個檔案生成 C 語言中的陣列並儲存到標頭檔案中 (2)
阿新 • • 發佈:2021-07-14
這是上一篇檔案<<使用 python 把一個檔案生成 C 語言中的陣列並儲存到標頭檔案中>>續,
在測試的時候,突然發現了一個現象,就好像是一道光,給了我一個解決轉換大檔案慢的問題的靈感,這個現象是從轉換率的變化率一開始很快然後開始變慢,如下:
從上圖看,轉換到 60% 左右還很快,然後就變得很慢了。
目前得做法是,把轉換出來得資料都放到一個字串中,等轉換結束後,一次性寫入檔案,上面看到轉化率的過程,都是在讀取、轉換、新增到字串,這 3 個步驟前 2 給都試過了,解決不了轉換慢的問題,那會不會是在第 3 個步驟呢,
來、測試下,思路是每轉換一定數量後,先儲存進檔案中,一直重複這 2 個步驟,直到轉換完成。
首先,前面部分程式碼還是跟之前一樣,先判斷輸入引數中是否包含待處理檔案,及待處理檔案是否存在:
if __name__ == "__main__": if len(sys.argv) != 2: print("argv is not 2") exit() print(sys.argv[0] + "," + sys.argv[1]) if os.path.exists(sys.argv[1]) is False: print("file not exit") exit() start_time = time.time() filepath = sys.argv[1] print("The file is:" + sys.argv[1]) if "\\" in filepath: filename = filepath.split("\\")[-1].split(".")[0] else: filename = filepath.split(".")[0] filename_upper = filename.upper()
然後實現一個儲存資料的函式:
def save_data2header(filename,dat):
path = filename + ".h"
file = open(path,"a+")
file.write(dat)
file.close()
因為把資料儲存到檔案中也是分開來的,每次寫檔案是往檔案後面新增資料,所以開啟檔案時使用以 “a+” 方式開啟,然後先把標頭檔案前面部分寫進檔案:
header = "#ifndef __" + filename_upper + "_H__\n" header = header + "#define __" + filename_upper + "_H__\n\n" header = header + "const uint8_t " + filename + "[] = {\n" save_data2header(filename,header)
然後是讀取、轉換、儲存:
fileinfo = os.stat(filepath)
line = fileinfo.st_size / 16
target = ""
f = open(filepath, "rb")
count = 0
for l in range(int(line)):
for j in range(16):
data = f.read(1)
he = "0x" + data.hex()
target = target + he + ","
target = target + "\n"
count = count +1
if count == 1000:
save_data2header(filename,target)
count = 0
target = ""
print("\rrate of progress: %f%% " % (l *100 / line), end="")
save_data2header(filename,target)
f.close()
這裡做法是沒轉換 1000 行就儲存一次,最後新增標頭檔案尾部、計算所花時間:
header_end = "};" + "\n#endif\n"
save_data2header(filename,header_end)
end_time = time.time()
print("\nLast time:",end="")
print(end_time - start_time)
執行結果如下:
這一次居然才用了差不多 37 秒,算了下未優化前居然是這次的 825.5 倍:
實在是太讓人震驚了。
這是什麼原因呢?
想了下,之前的做法,時間是耗在了往 python 的字元變數新增資料上,這字元變數使用的是什麼結構體,往字元變數上新增資料使用的是什麼演算法,也許搞懂了這些就知道原因在哪了。