Python 优化列表理解或备选方案的方法

Python 优化列表理解或备选方案的方法,python,list,performance,Python,List,Performance,list1包含长度约为50000的索引列表。 list2包含一个长度约为60000的列表或单词 我使用以下列表理解对列表进行迭代: newList= [w for w in list2 if list2.index(w) in list1] 问题是,这需要相当长的时间才能运行,是否有人知道加快这一过程的任何提示、技巧或窍门,或者以更快的方法实现相同的结果 我发现将列表1转换为一个集合可以加快进程,但仍然比我希望的慢index()需要搜索列表以查找项目的索引,并且它只查找找到的第一个项目的第一个

list1
包含长度约为50000的索引列表。
list2
包含一个长度约为60000的列表或单词

我使用以下列表理解对列表进行迭代:

newList= [w for w in list2 if list2.index(w) in list1]
问题是,这需要相当长的时间才能运行,是否有人知道加快这一过程的任何提示、技巧或窍门,或者以更快的方法实现相同的结果

我发现将列表1转换为一个集合可以加快进程,但仍然比我希望的慢

index()
需要搜索列表以查找项目的索引,并且它只查找找到的第一个项目的第一个索引(如果存在重复项,这一点很重要)。这意味着这是一个
O(n²)
算法。然后在整个列表1中搜索它,使其
O(n²+mn)
。但是您已经知道了索引,因为您正在遍历
list2
——没有理由搜索它。因此,不要再搜索了,只需将索引设置为一个集合,然后查看您所在的索引是否在其中。这将是O(n)

Most列表操作为O(n)。您的列表中的一行可能是O(n^3)。因此,考虑到这一点,我建议将其分为两行,而不是一行:

indices = set(x for x in list1 if x < len(list2))
newList = [w for i,w in enumerate(list2) if i in indices]

列表中是否可以包含重复项?这是非常不可能的
indices = set(x for x in list1 if x < len(list2))
newList = [w for i,w in enumerate(list2) if i in indices]
indices = set(x for x in list1 if x < len(list2))
lookup = {}
for i,w in enumerate(list2):
    if w not in lookup:
        lookup[w] = i
newList = [w for w in list2 if lookup[w] in indices]