Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
高效算法或python';从非常大的列表中删除子列表的内置函数_Python_Algorithm_List - Fatal编程技术网

高效算法或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)操作。但是如果你在集合中

我想从包含大约100000个网络地址作为元素的列表中删除子列表(20000-80000个元素)。我正在用python创建我的程序

我知道有两种方法:

  • python的过滤方法:

    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無: “谢谢,”他补充道