Re: [問題] 將list快速寫入檔案的方式?

看板Python作者 (qqaa)時間9年前 (2016/03/08 11:54), 編輯推噓2(205)
留言7則, 3人參與, 最新討論串3/3 (看更多)
: with open('123.txt') as fi, open('456.txt', 'w') as fo: : for _ in xrange(startindex): # 跳過 startindex 行 : fi.next() : for _ in xrange(endindex - startindex): : fo.write(fi.readline()) : 我不確定後面的方法會不會比較快, 但至少比較省記憶體(不用整個檔讀進來) 因為不用把整個檔案讀進記憶體,在檔案大的時候肯定會比 readlines() 快不少 另外,我發現如果用 itertools + writelines 的話,可以再快一些 實驗方法: 1. 生成檔案: n = 2 * 10 ** 7 for _ in xrange(n): print _ 2. 分別用下列的 main 函數來讀檔、寫檔 def main(i, o): with open(i) as fi, open(o, 'w') as fo: fo.writelines(itertools.islice(fi, 30, 1500000)) def main(i, o): with open(i) as fi, open(o, 'w') as fo: map(fo.write, itertools.islice(fi, 30, 1500000)) def main(i, o): with open(i) as fi, open(o, 'w') as fo: for _ in xrange(30): fi.readline() # fi.next() or next(fi) will cause ValueError on next fi.readline() for _ in xrange(1500000 - 30): fo.write(fi.readline()) 3. Result: https://imgur.com/1RkWRFC
可以看到 writelines + itertools 最快, map + write + itertools 次之 不過很神奇的是用 map 時,記憶體的使用量高了不少。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 72.14.230.41 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1457409261.A.DDE.html

03/08 18:20, , 1F
請問你是怎麼監看時間的?
03/08 18:20, 1F

03/09 01:58, , 2F
我猜可能是因為 map 還是會 allocate 一個 list 的關係
03/09 01:58, 2F

03/09 01:58, , 3F
想看執行時間請參考 timeit module
03/09 01:58, 3F

03/09 09:55, , 4F
我是裝 memory_profiler (pip install memory_profiler)
03/09 09:55, 4F

03/09 09:55, , 5F
然後用 mprof run xxx.py args...
03/09 09:55, 5F

03/09 09:56, , 6F
mprof plot 可以畫圖
03/09 09:56, 6F

03/09 11:13, , 7F
感謝你, 我去試試, 我之前都用timeit只是他有圖好方便XD
03/09 11:13, 7F
文章代碼(AID): #1MtapjtU (Python)
文章代碼(AID): #1MtapjtU (Python)