Vis*_*tel 0 python algorithm list
我想从包含大约100000个网络地址的列表中删除子列表(20000-80000个元素)作为其中的元素.我在python中创建我的程序.
我知道有两种方法:
python的过滤方法:
newl = [x for x in list if x not in sublist]
Run Code Online (Sandbox Code Playgroud)简单的嵌套for循环
但是,在我的案例中,两者都需要花费大量时间来处理.我需要有效的方法来解决这个问题,这可以给出快速的结果 如果有人有任何想法或遇到这种问题,请分享.谢谢.
当你这样做时x in list,这是一个O(n)操作.但是如果你进行x in set操作,那就是O(1)操作,因为集合在内部保持哈希值.所以最好的方法是比较替代方案.
from random import shuffle, sample
list = range(100000)
shuffle(list)
sublist = sample(list, 20000)
set_sublist = set(sublist)
Run Code Online (Sandbox Code Playgroud)
保留列表中的顺序,但列表检查包含的速度很慢.
%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
Run Code Online (Sandbox Code Playgroud)
快速但列表上的订单不会保留.
%time news = set(list) - set(sublist)
CPU times: user 16.2 ms, sys: 44 µs, total: 16.3 ms
Wall time: 16.3 ms
Run Code Online (Sandbox Code Playgroud)
这仅比上面的设置差异方法略慢,但是与当前方法相比,列表的顺序得以保留并且仍然执行得非常快.
%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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |