[問題] 如何優化python讀檔速度

看板Python作者 (阿岳)時間14年前 (2012/01/02 21:31), 編輯推噓1(1010)
留言11則, 4人參與, 最新討論串1/1
*環境:* Python2.6 + Django1.2.5 + MySql + DotCloud *前置作業:* 現在有幾千個文件檔 每個文件裡約有200-400筆資料 (文件範例共2個檔案) 1.txt為1筆資料, 內容: 8.44587 6.42955 1.59212 0.225454 4 3 0 0 1 0 0 0 28 82 29 9 1 0 0 0 1 23 42 67 39 0 0 0 0 0 0 2 4 0 0 0 51 21 0 0 2 4 0 2 162 162 28 34 26 2 1 32 29 52 35 162 162 14 1 7 0 0 0 11 43 1 0 0 47 24 9 0 0 0 0 13 162 40 4 4 24 14 16 162 35 4 1 48 162 85 28 80 0 0 0 18 58 5 0 0 2 17 8 0 0 1 3 0 40 13 3 0 1 5 35 71 8 0 0 4 44 55 40 38 0 0 0 3 9 5 0 0 2.txt為2筆資料 內容: 8.44587 6.42955 1.59212 0.225454 4 3 0 0 1 0 0 0 28 82 29 9 1 0 0 0 1 23 42 67 39 0 0 0 0 0 0 2 4 0 0 0 51 21 0 0 2 4 0 2 162 162 28 34 26 2 1 32 29 52 35 162 162 14 1 7 0 0 0 11 43 1 0 0 47 24 9 0 0 0 0 13 162 40 4 4 24 14 16 162 35 4 1 48 162 85 28 80 0 0 0 18 58 5 0 0 2 17 8 0 0 1 3 0 40 13 3 0 1 5 35 71 8 0 0 4 44 55 40 38 0 0 0 3 9 5 0 0 8.44587 6.42955 1.59212 3.26753 7 3 0 0 0 0 0 3 51 62 33 28 7 0 0 4 2 8 35 75 43 8 2 0 0 1 6 1 2 13 9 0 52 7 0 0 0 0 0 11 163 119 24 59 37 5 1 31 27 21 19 163 163 46 5 3 0 0 0 10 47 28 16 0 52 2 0 0 0 0 0 8 163 21 1 6 29 70 42 137 24 3 1 29 163 163 27 24 1 4 0 2 45 24 0 0 7 0 0 0 0 0 0 3 37 0 0 0 2 29 47 61 1 0 0 0 24 88 25 5 1 2 0 0 2 3 0 0 ######################################################## *目的:* 把文件裡的每筆資料先用固定格式, 再用record_query_vector包成一個list (請先不要提psyco和pypy、multithread及mysql的LOAD DATA INFILE,是否能從程式去改) *問題:* 我目前程式是這樣,主要耗的速度是讀檔的時間, 光是讀幾百個檔( 迴圈次數多 ),就要花將近40秒的時間, 請問該怎麼改?讓速度更快呢? 請指點一下或者麻煩改程式碼,麻煩了,謝謝您。 *變數: * 全部文件檔=all_f=[ ] try與finally包成的程式是文件資料要轉成的格式 for ts in TData.objects.raw(*'SELECT id,* f_url *FROM ts_to'*): all_f.append(ts.f_url) 第幾個文件檔的連結=f_url record_query_vector=[ ] * * *程式:* for f_url in all_f: test_dict={ }#字典 file=open(f_url) next(file) try: for line in file: dk=line.split()[:4]#串列,字典的key dk=' '.join(dk)#字串 dv=line.split()[4:]#串列,字典的value dv=' '.join(dv)#串列包字串 dv= [int(n) for n in dv.split(' ')] test_dict[str(dk)]=dv count+=1 finally: file.close() record_query_vector.append(test_dict.values()) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.165.146

01/02 22:32, , 1F
最後test_dict.values()不就只有取dv? 那為什麼一開始還要
01/02 22:32, 1F

01/02 22:32, , 2F
把dk,dv用test_dict包在一起?
01/02 22:32, 2F

01/03 00:01, , 3F
我是為了程式看起來不要太冗長,其實後面還是有用到的。
01/03 00:01, 3F

01/03 01:22, , 4F
dv= [int(n) for n in dv.split(' ')] 也許可以改成
01/03 01:22, 4F

01/03 01:23, , 5F
dv = map(int,dv.split(' ')), 不過這裡蠻奇怪的是' '.join
01/03 01:23, 5F

01/03 01:23, , 6F
之後又用split(' ')分開是有什麼用意嗎??
01/03 01:23, 6F

01/03 08:18, , 7F
IO花太多時間了 檔案小的話 整個檔一次讀進memory裡
01/03 08:18, 7F

01/03 08:19, , 8F
for line in file.readlines(): ...
01/03 08:19, 8F

01/03 09:49, , 9F
抱歉,我給的小範例給錯了,現在改回來。
01/03 09:49, 9F
※ 編輯: andy6756 來自: 59.121.160.126 (01/03 09:52)

01/07 00:54, , 10F
換SSD?
01/07 00:54, 10F

01/07 00:55, , 11F
(遮臉
01/07 00:55, 11F
文章代碼(AID): #1F0R6XLv (Python)
文章代碼(AID): #1F0R6XLv (Python)