[問題] 請教更高效的比對方法(已解決)

看板Python作者 (沙羅是轉換後的文字檔打m)時間6年前 (2019/03/03 00:27), 6年前編輯推噓10(10012)
留言22則, 10人參與, 6年前最新討論串1/1
我有兩個純文字檔 ①Keyword.txt:待整理的關鍵字集 ②NG.txt:已確定剔除的關鍵字集 兩個檔案都是每行一個關鍵字,各約1000行 我的工作是把Keyword.txt和NG.txt比對,如果Keyword.txt中的關鍵字未收錄在NG.txt裡 ,則寫入Temp.txt 我的做法是把NG.txt的內容存成字典,然後將Keyword.txt中的關鍵字逐一與字典比對 但這個方法似乎效率不太好,花了1分鐘以上的時間才完成 所以想請教有無更高效率的做法? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 216.151.180.98 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1551544071.A.CF1.html

03/03 00:31, 6年前 , 1F
你每讀一行NG就要開檔關檔一次? 另外不要用關鍵字當變數名
03/03 00:31, 1F

03/03 00:33, 6年前 , 2F
其實是開檔兩次 temp.txt跟ketword.txt
03/03 00:33, 2F

03/03 00:34, 6年前 , 3F
一次讀完NG & keyword檔案再一次寫到 temp.txt就好
03/03 00:34, 3F
變數是我貼文時沒改到,不好意思。我不確定是否是頻繁讀寫拖慢效率,因為我在其他地 方也有更多次數的讀寫,但耗費的時間仍少於20秒,所以我才想是否是比對字典太花時間 。

03/03 00:44, 6年前 , 4F
O(n)的東西寫成O(n^2)..
03/03 00:44, 4F
對,早上起來再看就發現錯了QQ

03/03 01:03, 6年前 , 5F
set difference
03/03 01:03, 5F
謝謝,這個方法還沒用過,我測試看看效率

03/03 01:36, 6年前 , 6F
t=open 到 t.close 的縮排位置錯了, 要跟第一個for一樣
03/03 01:36, 6F
對,昨晚沒看出來QQ

03/03 01:36, 6年前 , 7F
keyword集合A NG集合B A-B?
03/03 01:36, 7F

03/03 01:38, 6年前 , 8F
還有,存放NG關鍵字dict的變數名字最好換一下,比如用ng
03/03 01:38, 8F

03/03 01:40, 6年前 , 9F
變數名字取dict可能會有問題
03/03 01:40, 9F
變數是我貼文時沒改到,不好意思。

03/03 02:41, 6年前 , 10F
set difference 就解了阿
03/03 02:41, 10F

03/03 02:44, 6年前 , 11F
既然你都知道有set或是dict這種數據結構 怎麼會想要每查
03/03 02:44, 11F

03/03 02:44, 6年前 , 12F
一個字打開另一個檔爬一遍阿...
03/03 02:44, 12F

03/03 02:46, 6年前 , 13F
我建議看一下你其他地方的文件讀寫是不是也是這種寫法,
03/03 02:46, 13F

03/03 02:46, 6年前 , 14F
計算不花時間,io的時間不知道耗費了多少
03/03 02:46, 14F
其他地方也有類似寫法,但都效率正常,不過我還是Review一下有沒有問題,謝謝。

03/03 04:22, 6年前 , 15F
你的兩個for loop要在同一個indent啦~
03/03 04:22, 15F
對,早上重看codes就發現錯了…暈

03/03 04:22, 6年前 , 16F
你現在這樣是nested loop,造成每讀一行NG.txt,就讀取一整
03/03 04:22, 16F

03/03 04:22, 6年前 , 17F
個Keyword.txt一次,那當然效率很差
03/03 04:22, 17F

03/03 04:22, 6年前 , 18F
本來應該是O(N+M)的,你的寫法是O(NM)差很多
03/03 04:22, 18F

03/03 04:23, 6年前 , 19F
還有跟前幾樓說的一樣,用set即可不需用dictionary
03/03 04:23, 19F
謝謝,其實那段code是節錄出來再改掉變數名才貼的。使用dict的原因是在原程式中另有 用途。不過單純就這段目的而言確實如您所說用set就好了。 ※ 編輯: shala (209.234.253.197), 03/03/2019 09:44:46

03/03 16:40, 6年前 , 20F
ahocorasick
03/03 16:40, 20F

03/04 04:43, 6年前 , 21F
Don’t use naive solutions, try elasticsearch
03/04 04:43, 21F

03/04 17:44, 6年前 , 22F
可以解釋為什麼嗎?謝謝
03/04 17:44, 22F
※ 編輯: shala (45.56.161.176), 03/13/2019 21:25:37
文章代碼(AID): #1SUgy7pn (Python)
文章代碼(AID): #1SUgy7pn (Python)