作者CaptPlanet (ep)
看板Python
标题[问题] 请问有什麽办法加快这个 for loop 吗?
时间Tue Feb 27 15:53:13 2018
有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 呢?
谢谢各位高手
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 110.28.65.74
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1519717995.A.701.html
1F:→ uranusjr: 简单的方法是把 list_a 的 index 用 dict cache 起来 02/27 16:03
2F:→ uranusjr: 每个 b 里的值都要在 a 从头找一次当然会慢 02/27 16:03
3F:→ CaptPlanet: 感恩 已解决 02/27 16:21
4F:推 Yshuan: 做一个 dict([(v, i) for i, v in enumerate(list_a)]) 02/27 16:51
5F:→ Yshuan: 用空间换取时间这样... 02/27 16:51
6F:推 Yshuan: res_li = map(lambda k: new_dict.get(k, ""), list_b) 02/27 16:54
7F:推 thefomalhaut: cython or numpy? 02/28 00:53
8F:→ secondsee: 或可用set找出交集, 直接拿去list_a比对 02/28 10:36
9F:→ secondsee: check = set(list_a) & set(list_b) 02/28 10:41
10F:→ secondsee: res_li = [i for i,x in enumerate(a) if x in check] 02/28 10:43
11F:推 vfgce: 楼上的解法有误...也没有比dict快. 02/28 11:58
12F:推 vfgce: Y大解法ok,只是map回传的是iterator,再转成list似乎没有 02/28 12:03
13F:→ vfgce: 比直接用list comprehension快. 02/28 12:04
14F:推 eggeggss: 2个list转set後intersection再产生新的list 10/27 16:42