高效算法或python';从非常大的列表中删除子列表的内置函数
我想从包含大约100000个网络地址作为元素的列表中删除子列表(20000-80000个元素)。我正在用python创建我的程序 我知道有两种方法:高效算法或python';从非常大的列表中删除子列表的内置函数,python,algorithm,list,Python,Algorithm,List,我想从包含大约100000个网络地址作为元素的列表中删除子列表(20000-80000个元素)。我正在用python创建我的程序 我知道有两种方法: python的过滤方法: newl = [x for x in list if x not in sublist] 简单嵌套循环 但是,在我的案例中,两者都需要大量的时间来处理。 我需要有效的方法来解决这个问题,它可以给出快速的结果。 如果有人有任何想法或面临这种问题,请分享。谢谢。当您在列表中执行x时,这是一个O(n)操作。但是如果你在集合中
newl = [x for x in list if x not in sublist]
如果有人有任何想法或面临这种问题,请分享。谢谢。当您在列表中执行
x时,这是一个O(n)
操作。但是如果你在集合中执行x
操作,那就是O(1)
操作,因为集合在内部维护散列。因此,最好的方法是比较备选方案
from random import shuffle, sample
list = range(100000)
shuffle(list)
sublist = sample(list, 20000)
set_sublist = set(sublist)
使用列表进行包含检查的列表理解
保留列表上的顺序,但列表的包含检查速度较慢
%time newl = [x for x in list if x not in sublist]
CPU times: user 40.8 s, sys: 146 ms, total: 41 s
Wall time: 41.7 s
设置差异
快速,但不保留列表上的顺序
%time news = set(list) - set(sublist)
CPU times: user 16.2 ms, sys: 44 µs, total: 16.3 ms
Wall time: 16.3 ms
使用集合进行包含检查的列表理解
这只比上面的“设置差异”方法稍微慢一点,但列表的顺序保持不变,与当前方法相比,仍然执行得非常快
%time newl = [x for x in list if x not in set_sublist]
CPU times: user 42.3 ms, sys: 2.95 ms, total: 45.3 ms
Wall time: 44.8 ms
在列表中执行x时,这是一个O(n)
操作。但是如果你在集合中执行x
操作,那就是O(1)
操作,因为集合在内部维护散列。因此,最好的方法是比较备选方案
from random import shuffle, sample
list = range(100000)
shuffle(list)
sublist = sample(list, 20000)
set_sublist = set(sublist)
使用列表进行包含检查的列表理解
保留列表上的顺序,但列表的包含检查速度较慢
%time newl = [x for x in list if x not in sublist]
CPU times: user 40.8 s, sys: 146 ms, total: 41 s
Wall time: 41.7 s
设置差异
快速,但不保留列表上的顺序
%time news = set(list) - set(sublist)
CPU times: user 16.2 ms, sys: 44 µs, total: 16.3 ms
Wall time: 16.3 ms
使用集合进行包含检查的列表理解
这只比上面的“设置差异”方法稍微慢一点,但列表的顺序保持不变,与当前方法相比,仍然执行得非常快
%time newl = [x for x in list if x not in set_sublist]
CPU times: user 42.3 ms, sys: 2.95 ms, total: 45.3 ms
Wall time: 44.8 ms
将子列表
转换为一个集合,您应该会看到性能提升。将它们都转换为集合,然后执行一个减去另一个。如果您不关心顺序,请按照Ben所说的去做,否则请按照Fourtheye所说的去做;)将子列表
转换为一个集合,您应该会看到性能提升。将它们都转换为集合,然后执行一个减去另一个。如果您不关心顺序,请按照Ben所说的去做,否则请按照Fourtheye所说的去做;)这将破坏顺序,可能不是问题,但应注意。@enrico.bacis我认为您应该为%time newl=[x代表列表中的x,如果x不在子列表中]
添加一个示例,这将保持顺序,然后这个答案应该完整。@mu無: “谢谢,”他补充道这将破坏顺序,可能不是问题,但应注意。@enrico.bacis我认为您应该为%time newl=[x代表列表中的x,如果x不在子列表中]
添加一个示例,这将保持顺序,然后这个答案应该完整。@mu無: “谢谢,”他补充道