Python 在更短的时间内从另一个列表中删除一个列表中的所有值(优化时间)

Python 在更短的时间内从另一个列表中删除一个列表中的所有值(优化时间),python,list,optimization,Python,List,Optimization,我给出下面的例子。我有两个列表,一个是总计列表,另一个是已处理元素列表。正如示例所示,其思想是消除已处理的元素。 问题是,对于真实数据,这需要我13分钟! 当然,它可以以某种方式进行优化。请帮忙 processed = ['a','b','c'] total = [(1, 'a', 'alaksdl'), (2, 'x', 'asda'), (3, 'b', 'asda'), (4, 'c', 'wef'), (5, 'e

我给出下面的例子。我有两个列表,一个是总计列表,另一个是已处理元素列表。正如示例所示,其思想是消除已处理的元素。 问题是,对于真实数据,这需要我13分钟! 当然,它可以以某种方式进行优化。请帮忙

processed = ['a','b','c']

total = [(1, 'a', 'alaksdl'),
         (2, 'x', 'asda'),
         (3, 'b', 'asda'),
         (4, 'c', 'wef'),
         (5, 'e', 'asaaa'),         
         (5, 'j', 'asd')                     
]

start = time.time()
result = [x for x in total if x[1] not in processed]
end = time.time()
print("Time: ",round(end - start,5), " segundos")

Time:  0.00014  segundos
[(2, 'x', 'asda'), (5, 'e', 'asaaa'), (5, 'j', 'asd')]
result

只需转换为中间的
dict
,删除
已处理的
项并转换回
结果

导入时间
已处理=['a'、'b'、'c']
总计=[(1,'a','alaksdl'),
(2,'x','asda'),
(3、‘b’、‘asda’),
(4"c","wef",,
(5,'e','asaaa'),
(5、‘j’、‘asd’)
]
开始=时间。时间()
inter={x[1]:x代表x总计}
对于正在处理的项目:
del inter[项目]
结果=列表(inter.values())
end=time.time()

这应该更像
O(n)

您可以使用pandas,如下所示。我们将为isin方法使用一组已处理的值,因为与列表相比,在一组中查找值通常要快得多。以下代码显示6000000个项目的列表需要几秒钟:

import pandas as pd

df=pd.DataFrame(total)
s=set(processed)
df2=df[-df[1].isin(s)]

res=[tuple(i) for i in df2.values]

>>> print(res)

[(2, 'x', 'asda'), (5, 'e', 'asaaa'), (5, 'j', 'asd')]

从13分钟到1.1秒,干得好!从13分钟到0.17秒,棒极了!!!!从13分钟到0.28秒,只多了十分之一秒。。。
s = set(processed)
list(filter(lambda x: x[1] not in s, total))