本文翻译自Python Wiki

本文基于GPL v2协议,转载请保留此协议。

本页面涵盖了Python中若干方法的时间复杂度(或者叫“大欧”,“Big O”)。该时间复杂度的计算基于当前(译注:至少是2011年之前)的CPython实现。其他Python的实现(包括老版本或者尚在开发的CPython实现)可能会在性能表现上有些许小小的差异,但一般不超过一个O(log n)项。

本文中,’n’代表容器中元素的数量,’k’代表参数的值,或者参数的数量。

列表(list)

以完全随机的列表考虑平均情况。

列表是以数组(Array)实现的。最大的开销发生在超过当前分配大小的增长,这种情况下所有元素都需要移动;或者是在起始位置附近插入或者删除元素,这种情况下所有在该位置后面的元素都需要移动。如果你需要在一个队列的两端进行增删的操作,应当使用collections.deque(双向队列)

操作

平均情况

复制

O(n)

O(n)

append[注1]

O(1)

O(1)

插入

O(n)

O(n)

取元素

O(1)

O(1)

更改元素

O(1)

O(1)

删除元素

O(n)

O(n)

遍历

O(n)

O(n)

取切片

O(k)

O(k)

删除切片

O(n)

O(n)

更改切片

O(k+n)

O(k+n)

extend[注1]

O(k)

O(k)

O(n log n)

O(n log n)

列表乘法

O(nk)

O(nk)

x in s

O(n)

min(s), max(s)

O(n)

计算长度

O(1)

O(1)

双向队列(collections.deque)

deque (double-ended queue,双向队列)是以双向链表的形式实现的 (Well, a list of arrays rather than objects, for greater efficiency)。双向队列的两端都是可达的,但从查找队列中间的元素较为缓慢,增删元素就更慢了。

操作

平均情况

最坏情况

复制

O(n)

O(n)

append

O(1)

O(1)

appendleft

O(1)

O(1)

pop

O(1)

O(1)

popleft

O(1)

O(1)

extend

O(k)

O(k)

extendleft

O(k)

O(k)

rotate

O(k)

O(k)

remove

O(n)

O(n)

集合(set)

未列出的操作可参考 dict —— 二者的实现非常相似。

操作

平均情况

最坏情况

x in s

O(1)

O(n)

并集 s|t

O(len(s)+len(t))

交集 s&t

O(min(len(s), len(t))

O(len(s) * len(t))

差集 s-t

O(len(s))

s.difference_update(t)

O(len(t))

对称差集 s^t

O(len(s))

O(len(s) * len(t))

s.symmetric_difference_update(t)

O(len(t))

O(len(t) * len(s))

由源码得知,求差集(s-t,或s.difference(t))运算与更新为差集(s.difference_uptate(t))运算的时间复杂度并不相同!前者是将在s中,但不在t中的元素添加到新的集合中,因此时间复杂度为O(len(s));后者是将在t中的元素从s中移除,因此时间复杂度为O(len(t))。因此,使用时请留心,根据两个集合的大小以及是否需要新集合来选择合适的方法。

集合的s-t运算中,并不要求t也一定是集合。只要t是可遍历的对象即可。

字典(dict)

下列字典的平均情况基于以下假设:

1. 对象的散列函数足够撸棒(robust),不会发生冲突。

2. 字典的键是从所有可能的键的集合中随机选择的。

小窍门:只使用字符串作为字典的键。这么做虽然不会影响算法的时间复杂度,但会对常数项产生显著的影响,这决定了你的一段程序能多快跑完。

操作

平均情况

最坏情况

复制[注2]

O(n)

O(n)

取元素

O(1)

O(n)

更改元素[注1]

O(1)

O(n)

删除元素

O(1)

O(n)

遍历[注2]

O(n)

O(n)

注:

[1] = These operations rely on the “Amortized” part of “Amortized Worst Case”. Individual actions may take surprisingly long, depending on the history of the container.

[2] = For these operations, the worst case n is the maximum size the container ever achieved, rather than just the current size. For example, if N objects are added to a dictionary, then N-1 are deleted, the dictionary will still be sized for N objects (at least) until another insertion is made.

python判断语句的复杂度_Python内置方法的时间复杂度(转)相关推荐

  1. python的四种内置数字类型_浅析Python数字类型和字符串类型的内置方法

    一.数字类型内置方法 1.1 整型的内置方法 作用 描述年龄.号码.id号 定义方式 x = 10 x = int('10') x = int(10.1) x = int('10.1') # 报错 内 ...

  2. python内置类型方法_浅析Python数字类型和字符串类型的内置方法

    一.数字类型内置方法 1.1 整型的内置方法 作用 描述年龄.号码.id号 定义方式 x = 10 x = int('10') x = int(10.1) x = int('10.1') # 报错 内 ...

  3. python在匿名函数作和_python内置函数和匿名函数

    楔子 在讲新知识之前,我们先来复习复习函数的基础知识. 问:函数怎么调用? 函数名() 如果你们这么说...那你们就对了!好了记住这个事儿别给忘记了,咱们继续谈下一话题... 来你们在自己的环境里打印 ...

  4. python内置类属性_Python内置方法和属性应用:反射和单例(推荐)

    1. 前言 python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict.list.set.min.max.range.sorted等.笔者最近在做项目框架时 ...

  5. python列表的内置方法_Python内置方法详解

    1. 字符串内置方法详解 为何要有字符串?相对于元组.列表等,对于唯一类型的定义,字符串具有最简单的形式. 字符串往往以变量接收,变量名.可以查看所有的字符串的内置方法,如: 1> count: ...

  6. md5加密解密代码_Python内置方法实现基于秘钥的信息加解密

    点击关注州的先生 精彩不容错过 在实际编程开发中,我们会使用到各类的加密算法来对数据和信息进行加密.比如密码中比较常见的MD5加密,以及AES加密等等.对于密码认证来说,MD5加密是比较适合的,因为其 ...

  7. Python数字类型及字符串类型的内置方法 ##

    数字类型及字符串类型的内置方法 数字类型 数字类型有哪些? 整型和浮点型 有哪些运算符? 平时用的加减乘除.整除.模运算.幂运算,比较运算等 他们的属性? 数字类型没有有序,无序一说.换言之,不存在索 ...

  8. python中reversed是什么意思_Python内置函数reversed()用法分析

    这篇文章主要介绍了Python内置函数reversed()用法,结合实例形式分析了reversed()函数的功能及针对序列元素相关操作技巧与使用注意事项,需要的朋友可以参考下 reversed()函数 ...

  9. python find方法的复杂度_python内置的方法的时间复杂度

    下列字典的平均情况基于以下假设: 1. 对象的散列函数足够撸棒(robust),不会发生冲突. 2. 字典的键是从所有可能的键的集合中随机选择的. 小窍门:只使用字符串作为字典的键.这么做虽然不会影响 ...

最新文章

  1. java从磁盘读取图片_java 怎样从磁盘读取图片文件
  2. Java基础:正则表达式
  3. junit测试NoSuchBeanDefinitionException: No bean named ‘dataSource‘ is define
  4. tidb mysql5.7_MYSQL5.7实时同步数据到TiDB
  5. 机器学习-分类算法-朴素贝叶斯算法07
  6. 数据仓库:Oracle Exadata和Netezza的比较
  7. oracle 动态注册和静态注册
  8. 关于perl和shell的参数传递
  9. java程序设计实验结论_实验报告三
  10. [PYTHON]一个简单的单元測试框架
  11. SLAM学习 | 世界坐标系转经纬度误差分析
  12. js获取本月第一天和当前时间
  13. DeFi 2.0的LaaS协议Elephant,或许是你熊市下为数不多的获利手段
  14. 杭州阿里五面全过程:一面技术面+二面(项目+技术)+三面(项目经理面)+四面(地区技术负责人面)...
  15. 苹果电脑系统太卡如何彻底清理内存?
  16. linux mips 时钟中断,Linux内核中地时钟中断.pdf
  17. 三国群英传霸业之王服务器维护,《三国群英传:霸王之业》1月7日维护更新公告...
  18. 按需视觉识别:愿景和初步方案
  19. PMP备考指南之第十一章:项目风险管理
  20. 101条伟大的计算机编程名言

热门文章

  1. linux下进程调度模拟程序,linux认证辅导:linux进程调度模拟怎么做?
  2. mysql分页概念_MySQL学习笔记之数据定义表约束,分页方法总结
  3. mac解压rar命令_苹果mac电脑上很好用的免费压缩软件?ezip压缩软件分享
  4. html 页面重复度高,html – CSS背景渐变重复问题
  5. 听障学生计算机课本,面向听障学生程序设计的计算机教学辅助系统
  6. C/C++ atof函数 - C语言零基础入门教程
  7. html音频控件隐藏,html5 – Html 5音频标签自定义控件?
  8. android 5. 蓝牙 mesh,蓝牙mesh组网
  9. 八数码c语言编程深度搜索,广度优先搜索解 八数码, 求意见, 求bug/
  10. linux ppp漏洞,Linux下ppp拨号的实现(Arm)