iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python中字典和列表性能的对比分析
  • 108
分享到

Python中字典和列表性能的对比分析

2023-06-15 09:06:42 108人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

本篇文章为大家展示了python中字典和列表性能的对比分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python列表和字典前面我们了解了 “大O表示法” 以及对不同的算法的评估,下面来讨论下 P

本篇文章为大家展示了python中字典和列表性能的对比分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

Python列表和字典

  • 前面我们了解了 “大O表示法” 以及对不同的算法的评估,下面来讨论下 Python 两种内置数据类型有关的各种操作的大O数量级:列表 list 和字典dict。

  • 这是 Python 中两种非常重要的数据类型,后面会用来实现各种数据结构,通过运行试验来估计其各种操作运行时间数量级。

对比 list 和 dict 操作如下:

Python中字典和列表性能的对比分析

List列表数据类型常用操作性能:

最常用的是:按索引取值和赋值(v=a[i],a[i]=v),由于列表的随机访问特性,这两个操作执行时间与列表大小无关,均为O(1)。

另一个是列表增长,可以选择 append() 和 “+”:lst.append(v),执行时间是O(1);lst= lst+ [v],执行时间是O(n+k),其中 k 是被加的列表长度,选择哪个方法来操作列表,也决定了程序的性能。

测试 4 种生成 n 个整数列表的方法:

Python中字典和列表性能的对比分析

创建一个 Timer 对象,指定需要反复运行的语句和只需要运行一次的"安装语句"。

然后调用这个对象的 timeit 方法,指定反复运行多少次。

# Timer(stmt="pass", setup="pass")   # 这边只介绍两个参数# stmt:statement的缩写,就是要测试的语句,要执行的对象# setup:导入被执行的对象(就和run代码前,需要导入包一个道理) 在主程序命名空间中  导入time1 = Timer("test1()", "from __main__ import test1") print("concat:{} seconds".fORMat(time1.timeit(1000)))time2 = Timer("test2()", "from __main__ import test2")print("append:{} seconds".format(time2.timeit(1000)))time3 = Timer("test3()", "from __main__ import test3")print("comprehension:{} seconds".format(time3.timeit(1000)))time4 = Timer("test4()", "from __main__ import test4")print("list range:{} seconds".format(time4.timeit(1000))

结果如下:

Python中字典和列表性能的对比分析

可以看到,4种方法运行时间差别挺大的,列表连接(concat)最慢,List range最快,速度相差近 100 倍。append要比 concat 快得多。另外,我们注意到列表推导式速度大约是 append 两倍的样子。

总结列表基本操作的大 O 数量级:

Python中字典和列表性能的对比分析

我们注意到 pop 这个操作,pop()是从列表末尾移除元素,时间复杂度为O(1);pop(i)从列表中部移除元素,时间复杂度为O(n)。
原因在于 Python 所选择的实现方法,从中部移除元素的话,要把移除元素后面的元素,全部向前挪位复制一遍,这个看起来有点笨拙
但这种实现方法能够保证列表按索引取值和赋值的操作很快,达到O(1)。这也算是一种对常用和不常用操作的折中方案。

list.pop()的计时试验,通过改变列表的大小来测试两个操作的增长趋势:

import timeitpop_first = timeit.Timer("x.pop(0)", "from __main__ import x")pop_end = timeit.Timer("x.pop()", "from __main__ import x")print("pop(0)          pop()")y_1 = []y_2 = []for i in range(1000000, 10000001, 1000000):    x = list(range(i))    p_e = pop_end.timeit(number=1000)    x = list(range(i))    p_f = pop_first.timeit(number=1000)    print("{:.6f}        {:.6f}".format(p_f, p_e))    y_1.append(p_f)    y_2.append(p_e)

结果如下:

Python中字典和列表性能的对比分析

将试验结果可视化,可以看出增长趋势:pop()是平坦的常数,pop(0)是线性增长的趋势。

Python中字典和列表性能的对比分析

字典与列表不同,是根据键值(key)找到数据项,而列表是根据索引(index)。最常用的取值和赋值,其性能均为O(1)。另一个重要操作contains(in)是判断字典中是否存在某个键值(key),这个性能也是O(1)。

Python中字典和列表性能的对比分析

做一个性能测试试验来验证 list 中检索一个值,以及 dict 中检索一个值的用时对比,生成包含连续值的 list 和包含连续键值 key 的
dict,用随机数来检验操作符 in 的耗时。

import timeitimport randomy_1 = []y_2 = []print("lst_time         dict_time")for i in range(10000, 1000001, 25000):    t = timeit.Timer("random.randrange(%d) in x" % i, "from __main__ import random, x")    x = list(range(i))    lst_time = t.timeit(number=1000)    x = {j: 'k' for j in range(i)}    dict_time = t.timeit(number=1000)    print("{:.6f}        {:.6f}".format(lst_time, dict_time))    y_1.append(lst_time)    y_2.append(dict_time)

结果如下:

Python中字典和列表性能的对比分析
Python中字典和列表性能的对比分析

  • 可见字典的执行时间与规模无关,是常数。

  • 而列表的执行时间则会随着列表的规模加大而线性上升。

上述内容就是Python中字典和列表性能的对比分析,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网Python频道。

--结束END--

本文标题: Python中字典和列表性能的对比分析

本文链接: https://www.lsjlt.com/news/279415.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python中字典和列表性能的对比分析
    本篇文章为大家展示了Python中字典和列表性能的对比分析,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Python列表和字典前面我们了解了 “大O表示法” 以及对不同的算法的评估,下面来讨论下 P...
    99+
    2023-06-15
  • Python字典和列表性能之间的比较
    Python列表和字典 前面我们了解了 “大O表示法” 以及对不同的算法的评估,下面来讨论下 Python 两种内置数据类型有关的各种操作的大O数量级:列表 list 和字...
    99+
    2024-04-02
  • Python列表、字典、元组和集合实例分析
    这篇文章主要介绍了Python列表、字典、元组和集合实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python列表、字典、元组和集合实例分析文章都会有所收获,下面我们一起来看看吧。列表1.列表什么是列表...
    99+
    2023-06-30
  • Python中优化列表和字典
    Python中优化列表和字典,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在循环内代码:@timeit def append_inside_loop(lim...
    99+
    2023-06-16
  • Python列表和集合效率源码对比分析
    这篇“Python列表和集合效率源码对比分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python列表和集合效率源码对比...
    99+
    2023-07-06
  • MessagePack和System.Text.Json序列化和反序列化性能及对比分析
    本博客将测试MessagePack 和System.Text.Json 序列化和反序列化性能项目文件: Program.cs代码: using BenchmarkDotNet.Ru...
    99+
    2023-01-28
    MessagePack 和System.Text.Json 序列化和反序列化 MessagePack 和System.Text.Json 序列化和反序列化
  • Python字符串,列表,字典和集合实例处理分析
    今天小编给大家分享一下Python字符串,列表,字典和集合实例处理分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.如何...
    99+
    2023-07-02
  • Python字典查找性能的示例分析
    这期内容当中小编将会给大家带来有关Python字典查找性能的示例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。timeit.repeattimeit.repeat默认会执行3轮,每轮执行1000000...
    99+
    2023-06-22
  • Go和Python Web服务器性能对比分析
    本篇内容介绍了“Go和Python Web服务器性能对比分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2024-04-02
  • python判断对象的类型(字典,列表,
    return (type(obj).__name__ == 'dict') 字典:dict 列表:list 集合:set ...
    99+
    2023-01-31
    字典 对象 类型
  • java原生序列化和Kryo序列化性能实例对比分析
    简介最近几年,各种新的高效序列化方式层出不穷,不断刷新序列化性能的上限,最典型的包括:专门针对Java语言的:Kryo,FST等等跨语言的:Protostuff,ProtoBuf,Thrift,Avro,MsgPack等等这些序列化方式的性...
    99+
    2023-05-31
    java kryo 序列化
  • C#、Java和Python性能比较分析
    本篇内容介绍了“C#、Java和Python性能比较分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!实验这里使用三种语言进行矩阵乘法。 矩...
    99+
    2023-06-27
  • Python列表和集合的效率对比
    程序运行效率程序的运行效率分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。时间复杂度主要衡量的是一个程序的运行速度,而空间复杂度主要衡量一个程序所需要的额外存储空间。一个程序执行所耗费的时...
    99+
    2023-05-14
    列表 Python 集合
  • Python中的列表、元祖、字典的区别
    定义方法列表可以包含不同类型的对象,可以增减元素,可以跟其他的列表结合或者把一个列表拆分,用[]来定义的eg:aList=[123,'abc',4.56,['inner','list'],7-9j]1.list(str):将str转换成li...
    99+
    2023-01-31
    元祖 字典 区别
  • python 列表,集合和字典的增删改查
    目录一 列表二 集合三 字典总结 一 列表 # 列表:包含0个或多个对象引用的有序队列,用中括号[]表示 # 增加 a = [] a.append(1) # a.append...
    99+
    2024-04-02
  • Java for循环和foreach循环的性能对比分析
    目录for循环和foreach循环的性能对比普通for循环语法foreach 循环语法for与foreach循环效率比较对于数组来说对于链表来说小结一下吧for循环和foreach循...
    99+
    2024-04-02
  • Java序列化与字典功能的序列化实例分析
    这篇文章主要介绍了Java序列化与字典功能的序列化实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java序列化与字典功能的序列化实例分析文章都会有所收获,下面我们一起来看看吧。两种解决方案前端查询字典数...
    99+
    2023-07-02
  • Python中如何通过itemgetter对字典列表进行排序
    本篇文章为大家展示了Python中如何通过itemgetter对字典列表进行排序,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。前言:我们有一个字典列表,想根据一个或多个字典中的值对列表进行排序。利用...
    99+
    2023-06-02
  • Python中的列表和元组的性能比较和选择原则是什么?
    Python中的列表和元组的性能比较和选择原则是什么?在Python中,列表和元组是两种常见的数据结构。它们都可以用来存储一组数据,但有一些重要的区别。本文将从性能角度比较列表和元组,并给出选择原则的建议。访问速度:在访问单个元素时,元组的...
    99+
    2023-10-22
    - 列表 (List) - 元组 (Tuple) - 性能比较 (Performance Comparison)
  • python中字典和列表的相互嵌套问题详解
    目录1.列表中存储字典:1.列表中存储多个字典2.访问列表中字典的值3.遍历访问多个值2.字典中存储列表1.访问字典中的列表元素2.访问字典中的值(字典中的值为列表)3.字典中存储字...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作