• Python在不同对象中使用 in 操作符的查找效率


    前言

    在Python中 in 操作符可以用于判断某个元素是否存在于当前对象中,而对于不同的Python对象,使用 in 操作符的处理效率是不一样的。

    今天我们主要针对 4 种不同的Python数据类型进行学习:list列表、tuple元组、set集合、dict字典。

    测试过程

    我们用于测试的 4 种Python数据类型,分别为 tmp_listtmp_tupletmp_settmp_dict,测试过程中,它们所包含的元素都是相同的,均通过 random.randint(0, num) 随机生成,但它们的长度均为 num - 3 ,也就是说在 [0, num] 范围内,将有3个整数不在上面的对象中,我们需要把这3个整数找出来。

    测试代码如下:

    import time
    import random
    
    
    def demo(target, num):
        time1 = time.time()
        res = []
        for i in range(num):
            if i not in target:
                res.append(i)
        time2 = time.time()
        print("结果:{},当前类型:{},耗时:{}".format(res, type(target), time2 - time1))
    
    
    num = 500
    tmp_set = set()
    while len(tmp_set) <= num - 3:
        tmp_set.add(random.randint(0, num))
    tmp_list = list(tmp_set)
    tmp_tuple = tuple(tmp_set)
    tmp_dict = {key: "" for key in tmp_set}
    
    demo(tmp_list, num)
    demo(tmp_tuple, num)
    demo(tmp_set, num)
    demo(tmp_dict, num)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    当 num = 50 时,得到如下结果:

    不包含的整数:[25, 31, 36],当前类型:<class 'list'>,耗时:0.0
    不包含的整数:[25, 31, 36],当前类型:<class 'tuple'>,耗时:0.0
    不包含的整数:[25, 31, 36],当前类型:<class 'set'>,耗时:0.0
    不包含的整数:[25, 31, 36],当前类型:<class 'dict'>,耗时:0.0
    
    • 1
    • 2
    • 3
    • 4

    当 num = 500 时,得到如下结果:

    不包含的整数:[114, 329, 355],当前类型:<class 'list'>,耗时:0.0059354305267333984
    不包含的整数:[114, 329, 355],当前类型:<class 'tuple'>,耗时:0.0052182674407958984
    不包含的整数:[114, 329, 355],当前类型:<class 'set'>,耗时:0.0
    不包含的整数:[114, 329, 355],当前类型:<class 'dict'>,耗时:0.0
    
    • 1
    • 2
    • 3
    • 4

    当 num = 5000 时,得到如下结果:

    不包含的整数:[445, 850, 3547],当前类型:<class 'list'>,耗时:0.3342933654785156
    不包含的整数:[445, 850, 3547],当前类型:<class 'tuple'>,耗时:0.39918947219848633
    不包含的整数:[445, 850, 3547],当前类型:<class 'set'>,耗时:0.00099945068359375
    不包含的整数:[445, 850, 3547],当前类型:<class 'dict'>,耗时:0.0
    
    • 1
    • 2
    • 3
    • 4

    当 num = 50000 时,得到如下结果:

    不包含的整数:[9296, 18652, 32281],当前类型:<class 'list'>,耗时:26.92029118537903
    不包含的整数:[9296, 18652, 32281],当前类型:<class 'tuple'>,耗时:25.956974506378174
    不包含的整数:[9296, 18652, 32281],当前类型:<class 'set'>,耗时:0.009968996047973633
    不包含的整数:[9296, 18652, 32281],当前类型:<class 'dict'>,耗时:0.009973287582397461
    
    • 1
    • 2
    • 3
    • 4

    当 num = 55000 时,得到如下结果:

    不包含的整数:[16086, 33891, 46161],当前类型:<class 'list'>,耗时:52.91718029975891
    不包含的整数:[16086, 33891, 46161],当前类型:<class 'tuple'>,耗时:52.84810948371887
    不包含的整数:[16086, 33891, 46161],当前类型:<class 'set'>,耗时:0.009554624557495117
    不包含的整数:[16086, 33891, 46161],当前类型:<class 'dict'>,耗时:0.007979393005371094
    
    • 1
    • 2
    • 3
    • 4

    当 num = 75000 时,得到如下结果:

    不包含的整数:[23057, 35827, 69232],当前类型:<class 'list'>,耗时:75.57932734489441
    不包含的整数:[23057, 35827, 69232],当前类型:<class 'tuple'>,耗时:64.49729013442993
    不包含的整数:[23057, 35827, 69232],当前类型:<class 'set'>,耗时:0.005983591079711914
    不包含的整数:[23057, 35827, 69232],当前类型:<class 'dict'>,耗时:0.005979776382446289
    
    • 1
    • 2
    • 3
    • 4

    当 num = 100000 时,得到如下结果:

    '''
    学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
    寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
    '''
    不包含的整数:[22499, 22800, 29652],当前类型:<class 'list'>,耗时:110.19707798957825
    不包含的整数:[22499, 22800, 29652],当前类型:<class 'tuple'>,耗时:109.08251285552979
    不包含的整数:[22499, 22800, 29652],当前类型:<class 'set'>,耗时:0.011965036392211914
    不包含的整数:[22499, 22800, 29652],当前类型:<class 'dict'>,耗时:0.009937524795532227
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    结论

    通过上面的测试,我们可以看到,总体来说,list、tuple它们使用 in 操作符的查找效率相差不多,set、dict它们使用 in 操作符的查找效率相差不多,但随着查找数据量的增大,list、tuple的处理效率变得越来越慢,而set、dict的处理效率,将远远优于list及tuple。

    list列表、tuple元组、set集合、dict字典,使用 in 操作符查找的平均时间复杂度如下:

    在这里插入图片描述
    当我们在处理数据量大且需频繁查找元素时,最好使用 set、dict ,这样将会大幅度提升处理速度。

  • 相关阅读:
    Day02SSM第二次笔记---加载properties文件和容器的相关知识
    前端面试题日常练-day74 【面试题】
    linux下ftp服务器的简单的搭建
    【数字IC/FPGA】基于握手的数据广播
    Linux 7:mybash的实现和进程间通信
    【腾讯云Cloud Studio实战训练营】构建基于React的实时聊天应用
    响应式织梦模板净水设备类网站
    前端设计模式——过滤器模式
    Web3 的通行证——DID 带来数字身份革命
    leetcode每天5题-Day11
  • 原文地址:https://blog.csdn.net/qdPython/article/details/126195973