• Python常见操作的时间复杂度


    Python常见操作的时间复杂度

    本文整理了Python中常见数据结构操作的时间复杂度,旨在帮助大家了解Python操作的性能,协助大家写出更快的代码。

    标注方法

    程序时间复杂度一般用"大O表示法(Big-O notation)"来表示。假如有如下代码:

    def list_check(to_check, the_list):
    	for item in the_list:
    		if to_check == item:
    			return True
    	return False
    
    • 1
    • 2
    • 3
    • 4
    • 5

    上面代码功能很简单,就是检查to_check是否在列表the_list中。我们称这个函数的时间复杂度为 O ( n ) O(n) O(n),其中 n n n 指列表the_list中的元素个数, O ( n ) O(n) O(n)的意思是算法所需时间的上限随列表中的元素个数线性增长。

    在我们描述时间复杂度时,通常会涉及2个数量:

    • O ( n ) O(n) O(n) 中的 n n n 通常表示容器中元素个数
    • O ( k ) O(k) O(k) 中的 k k k 通常表示参数或传入容器中元素个数

    常见复杂度表

    Big-O复杂度解释
    O ( 1 ) O(1) O(1)常量复杂度无论输入的大小,运行时间始终保持一个常数。
    例如从哈希表中取值的时间复杂度就是 O ( 1 ) O(1) O(1)
    O ( n ) O(n) O(n)线性复杂度运行时间随输入大小线性增长。
    遍历列表就是一个时间复杂度为 O ( n ) O(n) O(n)的操作。
    O ( n 2 ) O(n^{2}) O(n2)平方复杂度运行时间与输入大小呈平方关系。
    比如冒泡排序、插入排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2)
    O ( 2 n ) O(2^{n}) O(2n)指数复杂度运行时间与输入大小呈指数关系。指数复杂度的算法性能非常低。
    例如图论中的三色问题就是指数复杂度。
    O ( log ⁡ n ) O(\log_{n}) O(logn)对数复杂度当输入呈指数增长是,运行时间按线性增长。
    二分法查找就是典型的对数复杂度。

    常见复杂度的图像展示

    在这里插入图片描述

    List操作

    List是Python中使用最多的数据结构,熟悉List中各操作的时间复杂度对我们优化程序性能有很大帮助

    操作时间复杂度(平均情况)
    追加 append() O ( 1 ) O(1) O(1)
    拷贝 copy() O ( n ) O(n) O(n)
    删除元素 remove() O ( n ) O(n) O(n)
    删除切片 del lst[2:4] O ( n ) O(n) O(n)
    插入 insert() O ( n ) O(n) O(n)
    获取元素 lst[0] O ( 1 ) O(1) O(1)
    设置元素 lst[0] = 1 O ( 1 ) O(1) O(1)
    迭代 O ( n ) O(n) O(n)
    获取切片 lst[0:3] O ( k ) O(k) O(k)
    设置切片 lst[0:3] = [4, 5] O ( n + k ) O(n+k) O(n+k)
    扩展 extend() O ( k ) O(k) O(k)
    排序 lst.sort() O ( n log ⁡ n ) O(n \log_n) O(nlogn)
    获取长度 len() O ( 1 ) O(1) O(1)
    in O ( n ) O(n) O(n)
    min()``max() O ( n ) O(n) O(n)

    Set操作

    操作时间复杂度(平均情况)时间复杂度(最差情况)
    in O ( 1 ) O(1) O(1)
    差集 s-t O ( len ( s ) ) O(\text{len}(s)) O(len(s))
    交集 s&t O ( min ( len ( s ) , len ( t ) ) ) O(\text{min}(\text{len}(s), \text{len}(t))) O(min(len(s),len(t))) O ( len ( s ) × len ( t ) ) O(\text{len}(s) \times \text{len}(t)) O(len(s)×len(t))
    并集 s\|t O ( len ( s ) + len ( t ) ) O(\text{len}(s) + \text{len}(t)) O(len(s)+len(t))
    对称差集 s^t O ( len ( s ) ) O(\text{len}(s)) O(len(s)) O ( len ( s ) × len ( t ) ) O(\text{len}(s) \times \text{len}(t)) O(len(s)×len(t))
    多重交集 s1&s2&s3&...&sn ( n − 1 ) ∗ O ( l ) (n-1) * O(l) (n1)O(l) 其中 l = max ( len ( s 1 ) , … , len ( s n ) ) l = \text{max}( \text{len}(s_1),\dots,\text{len}(s_n)) l=max(len(s1),,len(sn))
    s.difference_update(t) O ( len ( t ) × len ( s ) ) O(\text{len}(t) \times \text{len}(s)) O(len(t)×len(s))
    s.symetric_difference_update(t) O ( len ( t ) ) O(\text{len}(t)) O(len(t))

    Deque操作

    dequepython标准库提供的双向队列

    操作时间复杂度(平均情况)
    队尾追加 append() O ( 1 ) O(1) O(1)
    队首追加 appendleft() O ( 1 ) O(1) O(1)
    队尾扩展 extend() O ( k ) O(k) O(k)
    队首扩展 extendleft() O ( k ) O(k) O(k)
    队尾移除 pop() O ( 1 ) O(1) O(1)
    队首移除 popleft() O ( 1 ) O(1) O(1)
    拷贝 copy() O ( n ) O(n) O(n)
    删除 remove() O ( n ) O(n) O(n)
    轮转 rotate(k) O ( k ) O(k) O(k)
  • 相关阅读:
    Bug小能手系列(python)_12: 使用mne库读取.set文件报错 TypeError: ‘int‘ object is not iterable
    音视频 ffplay命令播放媒体
    基于STC12C5A60S2系列1T 8051单片机的数模芯片DAC0832实现数模转换应用
    CentOS7.5虚拟机扩展xfs文件系统
    怎样做ChatGPT应用开发?
    Docker部署Emqx并配置ssl支持微信小程序
    阿里图库字体使用方法---新手适合看
    校企合作,人才共育|湖南工程学院第二期万应低代码实训营圆满收官
    ManageEngine 第六次入选 Gartner® 安全信息和事件管理魔力象限™!
    安科瑞支持以太网通讯、profibus通讯嵌入式电能表APM指导性技术要求-Susie 周
  • 原文地址:https://blog.csdn.net/jarodyv/article/details/127915486