详解Python字典查找性能

目录
  • timeit.repeat
  • 字典获取性能
    • 数据准备
    • 复杂获取
  • 总结

timeit.repeat

timeit.repeat默认会执行3轮,每轮执行1000000次。返回每轮的总执行时间列表

字典获取性能

大家都知道字典获取分为

中括号获取,获取不到会抛出KeyError

get获取,获取不到会返回默认值

下面比较两种获取方式的性能

数据准备

一条简单一条复杂

# logging标准库的level字典
level_mapping = {'CRITICAL': 50, 'FATAL': 50, 'ERROR': 40, 'WARN': 30, 'WARNING': 30, 'INFO': 20, 'DEBUG': 10, 'NOTSET': 0}
# elasticsearch日志
record = {'_index': 'logstash-project.test-env.release-user.root-2021', '_type': 'doc', '_id': '2f60jn0BaH-cdSPUSkiF', '_version': 1, '_score': None, '_source': {'method': 'GET', 'index_name': 'project.test-env.release-user.root', '@version': 'flask', 'path': 'D:\\alpha\\flask\\logstash\\core\\flask.py', 'logger_name': 'flask.exception', 'stack_info': None, 'user': 'root', '@timestamp': '2021-12-06T07:45:20.056Z', 'level': 'ERROR', 'thread_name': 'Thread-5', 'type': 'exception', 'env': 'release', 'process': 8716, 'funcName': 'exceptions', 'port': 55792, 'project': 'test', 'tags': [], 'lineno': 89, 'request': {'headers': {'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Postman-Token': '359faa6e-9527-4de7-82ff-eecb92656875', 'User-Agent': 'PostmanRuntime/7.28.4', 'Cookie': 'csrftoken=bf58fmaG5wBVabJwBeD8srVsfw7EjKe0VN7xD8mu817UzVm', 'Accept': '*/*', 'Host': '127.0.0.1:5000'}, 'args': {'a': '11', 'b': '22'}}, 'message': 'division by zero', 'host': 'DESKTOP-JCQ9527', 'status_code': 500, 'stack_trace': 'Traceback (most recent call last):\n  File "D:\\Envs\\logstash\\lib\\site-packages\\flask\\app.py", line 1950, in full_dispatch_request\n    rv = self.dispatch_request()\n  File "D:\\Envs\\logstash\\lib\\site-packages\\flask\\app.py", line 1936, in dispatch_request\n    return self.view_functions[rule.endpoint](**req.view_args)\n  File "D:\\flask\\logstash\\app.py", line 112, in get_raise\n    a/0\nZeroDivisionError: division by zero\n', 'remote_addr': '127.0.0.1', 'url': 'http://127.0.0.1:5000/raise?a=11&b=22'}, 'fields': {'@timestamp': ['2021-12-06T07:45:20.056Z']}, 'sort': [1638776720056]}
def test():
    level_mapping['CRITICAL']
timeit.repeat(lambda: test())
[0.08700739999994767, 0.0864886999997907, 0.08675769999990735]
# 中括号加try except
def test1():
    try:
        level_mapping['CRITICA']
    except:
        pass
timeit.repeat(lambda: test1())
[0.09164779999991879, 0.0921809999999823, 0.09076550000099814]  # key存在
[0.17694680000022345, 0.1759290999998484, 0.17659119999916584]  # key不存在
def test2():
    level_mapping.get('CRITICAL')
timeit.repeat(lambda: test2())
[0.131671400000414, 0.12985489999982747, 0.13035420000005615]

中括号获取比get方式快了50%左右;

但当使用中括号加try except,key不存在时要慢近一倍;

使用get时key存不存在设不设默认值都一样。

复杂获取

def test3():
    level_mapping[record['_source']['level']]
timeit.repeat(lambda: test3())
[0.1141027999999551, 0.11351319999994303, 0.11431539999989582]
def test4():
    level_mapping.get(record.get('_source').get('level'))
timeit.repeat(lambda: test4())
[0.22142400000007, 0.21937850000017534, 0.21913369999992938]

随着数据的复杂嵌套和链式操作,这次快了整整一倍。

总结

在能非常确定key存在且频繁获取数据的情况下,应该尽量使用中括号取值。

另外在Python3.6后,重写了字典的底层数据结构,从而使字典变得有序。

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • python基础之字典

    字典 # 字典:也是python中重要的数据类型,字典是由键值对组成的集合 # 通常使用 键来访问数据,效率非常高,和list一样支持对数据的添加.修改和删除操作 # 特点: # 1.不是序列类型,没有下标的概念,是无序的键值集合,是python中内置的高级数据类型' # 2.使用{}来表示字典对象,每个键值对使用逗号来分割 # 3.其键必须是不可变的类型[元组.字符串] 值可以是任意类型 # 4.每个键必定是唯一的,如果存在重复的键,那么后者会覆盖前者,产生覆盖 # 如何创建字典 dicta=

  • Python 字典详解

    目录 什么是字典? 创建字典 1. 直接赋值 2. 使用 dict()函数创建空字典 3. 获取字典元素 4. 唯一的键,如果字典中有俩个或多个相同的键,默认取最后一个 小结: 字典的增 字典的改 字典的删 1. del 方法 2. pop 方法 3. popitme 方法 4. clear 方法 字典的查 字典取值 1. keys 方法 2. values 方法 3. items 方法 字典复制 遍历字典 总结 什么是字典? 字典在 Python 中是一个无序的数据集合,字典使用键值对进行存储

  • Python cookbook(数据结构与算法)实现查找两个字典相同点的方法

    本文实例讲述了Python实现查找两个字典相同点的方法.分享给大家供大家参考,具体如下: 问题:寻找两个字典中间相同的地方(相同的键.相同的值等) 解决方案:通过keys()或者items()方法来执行常见的集合操作(比如求并集.交集和差集) >>> a={'x':1,'y':2,'z':3} >>> b={'ww':10,'x':11,'y':2} >>> a.keys()& b.keys() #键的交集 {'y', 'x'} >>

  • 解决Python字典查找报Keyerror的问题

    Python的字典一般都直接查找key ,比如 dict={'a':1,'b':2,'c':3} print(dict['a']) 但是如果在查找的key不存在的时候就会报:KeyError: 比如你要查看print(dict['d']) 由于这个时候dict里面并没有这个key ,所以就会直接报错,那么这个时候其实python给我们提供了一种很棒的解决方法,那就是用 setdefault,用法如下: dict.setdefault(key,[这里设置如果不存在想将值设置为啥,默认为None])

  • Python按键或值对字典进行排序

    给定一个字典,然后按键(key)或值(value)对字典进行排序. def dictionairy(): # 声明字典 key_value ={} # 初始化 key_value[2] = 56 key_value[1] = 2 key_value[5] = 12 key_value[4] = 24 key_value[6] = 18 key_value[3] = 323 print ("按键(key)排序:") # sorted(key_value) 返回重新排序的列表 # 字典按键

  • Python字典遍历的陷阱

    众所周知,Python中常常按照key.value的形式来遍历字典的items.若value是基本数据类型(int,float等),则是传的拷贝,是不能直接修改value的: dict2 = {'A':4, 'B':4} for _, num in dict2.items(): num += 1 print(dict2) # {'A': 4, 'B': 4} 这种情况下,若要修改value,只能按照my_dict[key] = ...的形式来修改. for key, num in dict2.i

  • 详解Python字典查找性能

    目录 timeit.repeat 字典获取性能 数据准备 复杂获取 总结 timeit.repeat timeit.repeat默认会执行3轮,每轮执行1000000次.返回每轮的总执行时间列表 字典获取性能 大家都知道字典获取分为 中括号获取,获取不到会抛出KeyError get获取,获取不到会返回默认值 下面比较两种获取方式的性能 数据准备 一条简单一条复杂 # logging标准库的level字典 level_mapping = {'CRITICAL': 50, 'FATAL': 50,

  • 详解Python字典小结

    字典(dict)结构是Python中常用的数据结构,笔者结合自己的实际使用经验,对字典方面的相关知识做个小结,希望能对读者一些启发~ 创建字典 常见的字典创建方法就是先建立一个空字典,然后逐一添加键(key)和值(value),比如创建字典person={'name':'Tome', 'age':22, 'city':'Shanghai, 'ID': '073569'},可以使用以下代码: person = {} person['name'] = 'Tom' person['age'] = 22

  • 详解Python字典的操作

    本篇介绍Python字典的常见操作. 修改字典元素,如图. 添加字典元素,如图. 删除字典元素del方法,如图. 删除字典元素clear方法,如图. len(),keys(), values()方法,如图. items, has_key方法,如图.

  • 详解Python字典的运算

    目录 问题描述 解决方案 讨论 总结 问题描述 怎样在数据字典中执行一些计算操作(比如求最值.排序等)? 解决方案 有如下字典: stocks = { 'ACME': 45.23, 'AAPL': 612.78, 'IBM': 205.55, 'HPQ': 37.20, 'FB': 10.75 } 为了对字典值进行计算操作,通常需要使用zip()函数先将字典的键和值反转过来.比如: # 取出value值最小的键值对 min_price = min(zip(stocks.values(), sto

  • 详解Python查找算法的实现(线性、二分、分块、插值)

    目录 1. 线性查找 2. 二分查找 3. 插值查找 4. 分块查找 5. 总结 查找算法是用来检索序列数据(群体)中是否存在给定的数据(关键字),常用查找算法有: 线性查找:线性查找也称为顺序查找,用于在无序数列中查找. 二分查找:二分查找也称为折半查找,其算法用于有序数列. 插值查找:插值查找是对二分查找算法的改进. 分块查找:又称为索引顺序查找,它是线性查找的改进版本. 树表查找:树表查找又可分二叉查找树.平衡二叉树查找. 哈希查找:哈希查找可以直接通过关键字查找到所需要数据. 因树表查找

  • 详解Python查找谁删了你的微信

    导语: 哈喽,哈喽~小编不知道你有没有经历过,想联系一位很长时间没有联系的朋友,发现对方很早以前已经把你删除了,而你还一无所知.反正小编经历过! 每个人的微信通信录里都存在一些「僵尸粉」,他们默默地躺在联系人列表中,你以为对方还是朋友,但是实际上,对方早已把你从好友列表中删了,那如何来筛选出这群人呢? 正文: 在开始编写脚本之前,需要做好如下准备工作 一部 Root 后的 Android 手机或者模拟器,如果没有 Root 的设备,推荐使用网易 MuMu 模拟器 Android 开发环境.And

  • 详解Python实现字典合并的四种方法

    目录 1.用for循环把一个字典合并到另一个字典 2.用dict(b, **a)方法构造一个新字典 3.用b.update(a)的方法,更新字典 4.把字典转换成列表合并后,再转换成字典 (1)利用a.items().b.items()把a.b两个字典转换成元组键值对列表 (2)合并列表并且把合并后的列表转换成字典 5.实例,netmiko使用json格式的数据进行自动化操作 (1)json格式的处理 (2)json格式的设备信息列表 (3)netmiko读取json类型信息示例 1.用for循

  • 详解python的字典及相关操作

    目录 什么是字典 创建一个字典 在原有字典上添加“键-值”对 修改字典中的值 删除键-值对 由类似对象组成的字典 遍历字典 什么是字典 字典是Python中最强大的数据类型之一,也是Python语言中唯一的映射类型.映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表,字典对象是可变的,它是一个容器类型,能存储任意个数的Python对象,其中也可包括其他容器类型. 字典类型与序列类型的区别:1.存取和访问数据的方式不同.2.序列类型只用数字类

  • 详解python字符串驻留技术

    前言 每种编程语言为了表现出色,并且实现卓越的性能,都需要有大量编译器级与解释器级的优化. 由于字符串是任何编程语言中不可或缺的一个部分,因此,如果有快速操作字符串的能力,就可以迅速地提高整体的性能. 在本文中,我们将深入研究 Python 的内部实现,并了解 Python 如何使用一种名为字符串驻留(String Interning)的技术,实现解释器的高性能.本文的目的不仅在于介绍 Python 的内部知识,而且还旨在使读者能够轻松地浏览 Python 的源代码:因此,本文中将有很多出自CP

  • 详解Python自建logging模块

    简单使用 最开始,我们用最短的代码体验一下logging的基本功能. import logging logger = logging.getLogger() logging.basicConfig() logger.setLevel('DEBUG') logger.debug('logsomething') #输出 out>>DEBG:root:logsomething 第一步,通过logging.getLogger函数,获取一个loger对象,但这个对象暂时是无法使用的. 第二步,loggi

随机推荐