专栏首页SEian.G学习记录Python判断键是否存在于字典方法:has_key()和in、dict.keys()的性能方面的差异

Python判断键是否存在于字典方法:has_key()和in、dict.keys()的性能方面的差异

在日常开发过程中,我们经常需要判断一个字典dict中是否包含某个键值,最近在开发代码中遇到一个问题,前端调用接口,会出现返回时间比较慢,进行排查分析,定位到主要是在判断一个字典dict是否包含某个键值item,然而我使用的是if item in dict.keys():,而该字典比较大,出现耗时严重的情况,于是改成if dict.has_key(item),速度马上变快了很多。

下面先简单了解一下has_key() 函数的作用

has_key() 函数用于判断键是否存在于字典中,如果键在字典 dict 里返回 true,否则返回 false。

注意:Python 3.X 不支持该方法。python3 去除了has_key()方法,参考:https://docs.python.org/3.1/whatsnew/3.0.html

Python 3.7环境测试:

>>> dict = {'Name': 'Zara', 'Age': 7}
>>> print("Value : ",dict.has_key('name'))      
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: 'dict' object has no attribute 'has_key'

从报错信息可以看到,python3.7已经不支持has_key了

Python 3.X 里不包含 has_key() 函数,被 __contains__(key) 替代:

>>> print("Value : ",dict.__contains__('name'))
Value :  False
 
>>> print("Value : ",dict.__contains__('Age'))
Value :  True

Python 3.X 里不包含 has_key() 函数之外,在 3.X 中还可以使用 in 操作符:

>>> dict1 = {'name': 'z', 'Age': 7, 'class': 'First'}
>>>
>>> if "user" in dict1:   
...     print(dict1["user"])   
...
>>>   ##由于user键没有,所以输出空
>>> if "name" in dict1:
...     print(dict1["name"])
...
z     ##输出键name对应的value

那么,下面我们继续探索这三种用法在性能方面上的差别

对字典大小为100到10000的字典分别使用in dict、in dict.keys()和has_key()判断键值是否存在,记录它们的时间消耗,并绘制出时间对比图,代码如下。

import time
from matplotlib import pyplot as plt
 
n = 10000
time1 = []
time2 = []
time3 = []
for n in range(100,10100,100):
    my_dict = {}
    for i in range(n):
        my_dict[i] = i
 
 
    start = time.time()
    for i in range(n):
        if i in my_dict.keys():
            pass
    end = time.time()
    print end - start
    time1.append(end - start)
 
 
    start = time.time()
    for i in range(n):
        if my_dict.has_key(i):
            pass
    end = time.time()
    print end - start
    time2.append(end - start)
 
 
    start = time.time()
    for i in range(n):
        if i in my_dict:
            pass
    end = time.time()
    print end - start
    time3.append(end - start)
 
 
t = range(100,10100,100)
plt.plot(t, time1, label='in keys()')
plt.plot(t, time2, label='has_key')
plt.plot(t, time3, label='in')
plt.legend()
plt.show()

执行结果:

由上图可以发现,dict.has_key和in dict要比in dict.keys()快得多,从图二也可以看到,in dict比dict.has_key要稍微快一点。

结论

在判断一个值item是否是某个字典dict的键值时,最佳的方法是if item in dict,它是最快的,其次的选择是if dict.has_key(item),绝对不要使用if itme in dict.keys()。

本文分享自微信公众号 - DBA的辛酸事儿(dbabitter),作者:SEianG

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-04-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python的字典 { }

    Python的字典属于一种数据类型,我们可以把数据存到字典里面,字典使用大括号“{}”来定义。 比如现在要存储一个人的信息然后读取出来,就可以使用切片的方式来体...

    py3study
  • Python的系统管理_02python

    上一节,起了几个简单例子,目的是解释Python其实并难,特别适用了Ipython这样一个利器,既然是Python的系统管理,面向系统管理员,Python的优点...

    py3study
  • Python字典 你必须知道的用法系列

    字典(dict)是Python中内置的一个数据结构,由多个键值对组成,键(key)和值(value)用冒号分隔,每个键值对之间用逗号(,)分隔,整个字典包括在大...

    oYabea
  • 如何判断Python字典中是否存在某个key

    在Python中有各种数据结构,而字典是我们生产中经常会用到的数据结构,这里记录一下如果判断某个key是否存在于字典中的二种方法。

    后场技术
  • python列表、字典、元组、集合学习笔记

    列 表 列表在python里是有序集合对象类型。 列表里的对象可以是任何对象:数字,字符串,列表或者字典,元组。与字符串不同,列表是可变对象,支持原处修改的操作...

    没有故事的陈师傅
  • Python 字典(Dictionary) has_key()方法

    Python 字典(Dictionary) has_key() 函数用于判断键是否存在于字典中,如果键在字典dict里返回true,否则返回false。

    周小董
  • Python基础(二)

    原文首发于2019-04-15:https://maoli.blog.csdn.net/article/details/89315948

    润森
  • python数据类型(整型、序列、字典)

    字典是python中的唯一的映射类型(哈希表) 字典对象是可变的,但是字典的键必须使用不可变对象,键值创建可以是字符串和元组,但是不能是列表,因为列表是可变的...

    嘻哈记
  • Python3学习笔记 | 七、Python的类型与运算-字典

    字典在Python里是无序集合对象类型,字典的值都有独立的唯一的键(Key),用相应的键来取值。

    TeamsSix
  • python字典

    本篇将介绍Python里面的字典,更多内容请参考:Python学习指南 Python是什么? Python内置了字典dict的支持,dict全称dicti...

    用户1174963
  • Python 字典(Dictionary)

    老七Linux
  • Python 基础(字典)

    键:只能是不可变数据类型,一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一

    数据STUDIO
  • 为什么set集合过滤停用词能那么快?

    上期我演示了高效过滤停用词的方法,这期我将带你重温Python基础中set集合和字典的使用方法,并讲解字典和集合的实现原理。本期同步更新的还另有一篇《词频统计的...

    快学Python
  • python之基础篇(五)——数据类型

      python使用5种数字类型:布尔型、整型、长整型、浮点型和复数,所有数字类型均为不可变对象。

    py3study
  • Python 高手都这样使用字典,这些高效方法你知道吗?|pythonic 小技巧

    可见其有多重要,不用多说,我平时用的也很多,索性总结一下,把一些常用的方法写下来,分享给大家。

    AlwaysBeta
  • python的字典学习(六)

    本博客主要说明python的字典基本的使用,在python中,字典使用的关键字是dict,使用的是{},下面我们通过一个具体的代码来看python字典类对...

    无涯WuYa
  • [PYTHON] 核心编程笔记之七-Py

    字典是Python语言中唯一的映射类型,映射类型对象里哈希值(键)和指向的对象(值)是一对多的关系,字典对象可变,它是一个容器类型,能存储任意个Python对象

    py3study
  • 如何在Python中将字典键作为列表返回?

    本文翻译自:How to return dictionary keys as a list in Python?

    用户7886150
  • Python--4 基本数据类型

      字符串str是在Python编写程序过程中,最常见的一种基本数据类型。字符串是许多单个子串组成的序列,其主要是用来表示文本。字符串是不可变数据类型,也就是说...

    py3study

扫码关注云+社区

领取腾讯云代金券