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)

当 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

当 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

当 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

当 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

当 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

当 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

当 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

结论

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

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

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

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python在不同对象中使用 in 操作符的查找效率 - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • Python中__new__方法的详细教程

    只有继承于object的新式类才能有__new__方法,__new__方法在创建类实例对象时由Python解释器自动调用,一般不用自己定义,Python默认调用该类的直接父类的__new__方法来构造该类的实例,如果该类的父类也没有重写__new__,那么将一直按此规矩追溯至object的__new__方法,因为object是所有新式类的基类,若需要自定义_…

    Python开发 2023年4月2日
    00
  • Python教程:读取文件有三种方法:(read、readline、readlines)详细用法

    python3中,读取文件有三种方法:read()、readline()、readlines()。 此三种方法,均支持接收一个变量,用于限制每次读取的数据量,但是,通常不会使用。 本文的目的:分析、总结上述三种读取方式的使用方法及特点。 一、read方法 特点:读取整个文件,将文件内容放到一个字符串变量中。 缺点:如果文件非常大,尤其是大于内存时,无法使用r…

    Python开发 2023年4月2日
    00
  • python3教程:json、pickle和sqlite3持久化存储字典对象

    在各种python的项目中,我们时常要持久化的在系统中存储各式各样的python的数据结构,常用的比如字典等。尤其是在云服务类型中的python项目中,要持久化或者临时的在缓存中储存一些用户认证信息和日志信息等,最典型的比如在数据库中存储用户的token信息。在本文中我们将针对三种类型的python持久化存储方案进行介绍,分别是json、pickle和pyt…

    Python开发 2023年4月2日
    00
  • python学习:获取指定目录下所有文件名os.walk和os.listdir

    1.os.walk 返回指定路径下所有文件和子文件夹中所有文件列表 其中文件夹下路径如下: import os def file_name_walk(file_dir): for root, dirs, files in os.walk(file_dir): print(“root”, root) # 当前目录路径 print(“dirs”, dirs) #…

    Python开发 2023年4月2日
    00
  • Python教程:常用网页字符串处理技巧

    首先一些Python字符串处理的简易常用的用法。其他的以后用到再补充。 1.去掉重复空格 s = “hello hello hello” s = ‘ ‘.join(s.split()) 2.去掉所有回车(或其他字符或字符串) s = “hello\nhello\nhello hello\n” print(s) s = s.replace(“\n”,””) p…

    Python开发 2023年4月2日
    00
  • 5个非常有意思的python代码,谁运行谁知道

    Python 能做很多无聊,但有意思的事情,例如接下来的一些案例。 Python 整蛊程序 以下程序,不要发代码,要不实现不了你整蛊的目的。 要打包成一个 exe 程序,发给朋友才有意思。 使用 pip install pyinstaller。 打包命令如下: pyinstaller -F 文件名.py 过程中如果出现 BUG(一般是编码错误),点击导航查看…

    Python开发 2023年4月2日
    00
  • python学习:各种推导式玩法-推导式套路

    1.推导式套路 除了最简单的列表推导式和生成器表达式,其实还有字典推导式、集合推导式等等。 下面是一个以列表推导式为例的推导式详细格式,同样适用于其他推导式。 variable = [out_exp_res for out_exp in input_list if out_exp == 2] out_exp_res:  列表生成元素表达式,可以是有返回值的函…

    Python开发 2023年4月2日
    00
  • Python深浅拷贝的理解

    1.拷贝 拷贝实际上其实就是在赋值,比如我们有一个列表L1,定义另一个列表L2引用列表L1,实际上就是在拷贝列表L1的值,由于由于L1列表是可变的数据类型,所以当L1的值变的时候,L2的值也是在跟着变的.那其实就算L1内的是不可变的数据类型,L1的内容变化,L2的内容也一样会随之变化的 # # 拷贝(赋值) # Python学习交流QQ群:153708845…

    Python开发 2023年3月31日
    00
合作推广
合作推广
分享本页
返回顶部