Python内置方法的时间复杂度

本文翻译自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)

python 的时间复杂度的更多相关文章

  1. Python(算法)-时间复杂度和空间复杂度

    时间复杂度 算法的时间复杂度是一个函数,它定量描述了该算法的运行时间,时间复杂度常用“O”表述,使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况 时间复杂度是用来估计算法 ...

  2. Search Insert Position——二分法

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  3. Python内置方法的时间复杂度(转)

    原文:http://www.orangecube.net/python-time-complexity 本文翻译自Python Wiki本文基于GPL v2协议,转载请保留此协议. 本页面涵盖了Pyt ...

  4. python 下的数据结构与算法---3:python内建数据结构的方法及其时间复杂度

    目录 一:python内部数据类型分类 二:各数据结构 一:python内部数据类型分类 这里有个很重要的东西要先提醒注意一下:原子性数据类型和非原子性数据类型的区别 Python内部数据从某种形式上 ...

  5. python实现排序算法 时间复杂度、稳定性分析 冒泡排序、选择排序、插入排序、希尔排序

    说到排序算法,就不得不提时间复杂度和稳定性! 其实一直对稳定性不是很理解,今天研究python实现排序算法的时候突然有了新的体会,一定要记录下来 稳定性: 稳定性指的是 当排序碰到两个相等数的时候,他 ...

  6. Python内置方法的时间复杂度

    转载自:http://www.orangecube.NET/Python-time-complexity 本页面涵盖了Python中若干方法的时间复杂度(或者叫"大欧"," ...

  7. python数据结构与算法第三天【时间复杂度计算方法】

    最优时间复杂度(不可靠) 最坏时间复杂度(保证) 平均时间复杂度(平均状况) 不同语句的时间复杂度: (1)顺序语句:使用加法 (2)循环语句:使用乘法 (3)分支语句:使用坏时间复杂度 例如:如下代 ...

  8. python数据结构与算法学习自修第二天【时间复杂度与大O表示法】

    #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ from Queue import Queue import time que = Queue() time ...

  9. Python开发【算法】:斐波那契数列两种时间复杂度

    斐波那契数列 概述: 斐波那契数列,又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, ...

随机推荐

  1. redis可视化工具的安装和调试

    Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  2. HTML5学习笔记 视频

    许多时髦的网站都提供视频.html5提供了展示视频的标准 检测您的浏览器是否支持html5视频 Web上的视频 直到现在,仍然不存在一项旨在网页上显示视频的标准. 今天,大多数视频是通过插件(比如Fl ...

  3. 【LeetCode-面试算法经典-Java实现】【101-Symmetric Tree(对称树)】

    [101-Symmetric Tree(对称树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a binary tree, check whether ...

  4. ssl证书文件

    证书(Certificate) - *.cer *.crt私钥(Private Key) - *.key证书签名请求(Certificate signing request) - *.csr 至于pe ...

  5. PHP操作MongoDB数据库具体样例介绍(增、删、改、查) (六)

    PHP操作mongodb: PHP 要操作mongodb须要打模块 官网能够下载:http://pecl.php.net/package/mongo 下载 mongodb设置成用户授权的启动方式 ph ...

  6. 双线机房双网卡双ip 路由设置

    做互联网网站,最头疼的事情之一就是电信和网通的互联互不通了,为了能够让北方网通和南方电信用户都可以快速的访问网站,解决办法就是托管 到双线机房.双线机房有两类,一类是通过BGP技术实现互联互通,服务器 ...

  7. mysql 一些常用指令

    登陆: mysql -u root -p //登陆,输入root密码 退出登陆 mysql>exit; mysql 为所有ip授权 mysql> GRANT ALL PRIVILEGES ...

  8. migrate的使用

    安装完yii2后,需要创建一张user表,这里用migrate创建 1.在dos窗口下,先cd到项目的目录,比如E:\>cd E:\Visual-AMP-x64\www\blog\blog 2. ...

  9. twemproxy源码分析2——守护进程的创建

    twemproxy源码中关于守护进程的创建实现得比较标准,先贴出代码来,然后结合一些资料来分析和列举一些实现守护进程的常用方法,不过不得不说twemproxy的实现确实是不错的,注释都写在了代码中,直 ...

  10. tensorboard 之 TF可视化

    tensorboard是TF提供的一个可视化的工具 1.tensorboard可视化的数据来源? 将tensorflow程序运行过程中输出的日志文件进行可视化展示. 1.1 tensorflow怎样输 ...