[問題] 請問有什麼辦法加快這個 for loop 嗎?

作者: CaptPlanet (ep)   2018-02-27 23:53:13
有list_a, list_b兩個list
list_a 有大約 70000 個 elements
list_b 大約 3 million 個 elements
程式大致如下:
res_li = []
for x in list_b:
try:
res_li.append(list_a.index(x))
except:
res_li.append("")
對 list_b 中的每一個 element
在 list_a 中找到一樣 element 把他的 index 加到新的 list 中
隨著 iteration 增加 速度變得越來越慢,
想請教各位為何會有這個現象以及有什麼方法加速這個 for loop 呢?
謝謝各位高手
作者: uranusjr (←這人是超級笨蛋)   2018-02-28 00:03:00
簡單的方法是把 list_a 的 index 用 dict cache 起來每個 b 裡的值都要在 a 從頭找一次當然會慢
作者: CaptPlanet (ep)   2018-02-28 00:21:00
感恩 已解決
作者: Yshuan (倚絃)   2018-02-28 00:51:00
做一個 dict([(v, i) for i, v in enumerate(list_a)])用空間換取時間這樣...res_li = map(lambda k: new_dict.get(k, ""), list_b)
作者: thefomalhaut (The Fomalhaut)   2018-02-28 08:53:00
cython or numpy?
作者: uranusjr (←這人是超級笨蛋)   2018-02-27 16:03:00
簡單的方法是把 list_a 的 index 用 dict cache 起來每個 b 裡的值都要在 a 從頭找一次當然會慢
作者: CaptPlanet (ep)   2018-02-27 16:21:00
感恩 已解決
作者: Yshuan (倚絃)   2018-02-27 16:51:00
做一個 dict([(v, i) for i, v in enumerate(list_a)])用空間換取時間這樣...res_li = map(lambda k: new_dict.get(k, ""), list_b)
作者: thefomalhaut (The Fomalhaut)   2018-02-28 00:53:00
cython or numpy?
作者: secondsee (窩ㄎ唷)   2018-02-28 10:36:00
或可用set找出交集, 直接拿去list_a比對check = set(list_a) & set(list_b)res_li = [i for i,x in enumerate(a) if x in check]
作者: vfgce (小兵)   2018-02-28 11:58:00
樓上的解法有誤...也沒有比dict快.Y大解法ok,只是map回傳的是iterator,再轉成list似乎沒有比直接用list comprehension快.

Links booklink

Contact Us: admin [ a t ] ucptt.com