有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 从头找一次当然会慢
作者:
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 从头找一次当然会慢
作者:
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?
或可用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快.