首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 13章 性能测量和大O算法分析
13.1 timeit模块
13.2 cProfile分析器
13.3 大O算法分析
13.4 大O阶
13.4.1 使用书架打比方描述大O阶
13.4.2 大O 测量的是最坏情况
13.5 确定代码的大O 阶
13.5.1 为什么低阶项和系数不重要
13.5.2 大O 分析实例
13.5.3 常见函数调用的大O 阶
13.5.4 一眼看出大O 阶
13.5.5 当n 很小时,大O并不重要,而n通常都很小
第 14章 项目实战
14.1 汉诺塔
14.1.1 汉诺塔输出
14.1.2 汉诺塔源代码
14.1.3 汉诺塔编写代码
14.2 四子棋
14.2.1 四子棋输出
14.2.2 四子棋源代码
14.2.3 四子棋编写代码
第 15章 面向对象编程和类
15.1 拿现实世界打比方:填写表格
15.2 基于类创建对象
15.3 创建一个简单的类——WizCoin
15.3.1 方法__init__()和self
15.3.2 特性
15.3.3 私有特性和私有方法
15.4 函数type()和特性__qualname__
15.5 非OOP 和OOP 的例子:井字棋
15.6 为现实世界设计类是一件难事儿
第 16章 面向对象编程和继承
16.1 继承的原理
16.1.1 重写方法
16.1.2 super()函数
16.1.3 倾向于组合而非继承
16.1.4 继承的缺点
16.2 函数isinstance()和issubclass()
16.3 类方法
16.4 类特性
16.5 静态方法
16.6 何时应该使用类和静态的面向对象特性
16.7 面向对象的行话
16.7.1 封装
16.7.2 多态性
16.8 何时不应该使用继承
16.9 多重继承
16.10 方法解析顺序
第 17章 Python 风格的面向对象编程:属性和魔术方法
17.1 属性
17.1.1 将特性转换为属性
17.1.2 使用setter 验证数据
17.1.3 只读属性
17.1.4 什么时候应该使用属性
17.2 Python 的魔术方法
17.2.1 字符串表示魔术方法
17.2.2 数值魔术方法
17.2.3 反射数值魔术方法
17.2.4 原地魔术方法
17.2.5 比较魔术方法
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(五)
小册名称:Python编程轻松进阶(五)
### 13.5.3 常见函数调用的大O阶 在Python编程中,理解算法的时间复杂度,尤其是通过大O表示法来衡量函数调用的效率,是进阶为高效程序员的关键一步。大O阶(Big O notation)提供了一种描述算法运行时间随输入规模增长而增长的方式,不关注具体的时间常数和低阶项,只关注增长速率最快的部分。本章节将深入探讨几种常见Python函数调用的大O阶,帮助读者在实际编程中做出更优化的选择。 #### 1. 列表操作 ##### 1.1 列表遍历(O(n)) Python中最常见的列表操作之一是遍历,无论是使用`for`循环还是列表推导式,其时间复杂度均为O(n),其中n是列表的长度。这意味着无论列表包含多少元素,算法都需要访问每个元素一次。 ```python # 示例:遍历列表 def traverse_list(lst): for item in lst: # 处理每个元素 pass # 时间复杂度:O(n) ``` ##### 1.2 列表索引访问(O(1)) 直接通过索引访问列表中的元素是高效的,其时间复杂度为O(1)。这意味着无论列表大小如何,访问任意位置元素的时间都是恒定的。 ```python # 示例:通过索引访问列表元素 def access_by_index(lst, index): return lst[index] # 时间复杂度:O(1) ``` ##### 1.3 列表排序(O(n log n)) Python的`list.sort()`方法或内置的`sorted()`函数通常使用高效的排序算法(如Timsort),其平均和最坏情况下的时间复杂度都是O(n log n),其中n是列表的长度。 ```python # 示例:对列表进行排序 def sort_list(lst): lst.sort() # 或 sorted(lst) # 时间复杂度:O(n log n) ``` #### 2. 字典操作 ##### 2.1 字典访问(O(1) 平均情况) 与列表的索引访问类似,字典通过键(key)访问值(value)的操作在平均情况下也是O(1)的。然而,在最坏情况下(例如,当所有的键都哈希到同一个槽时),其时间复杂度可能退化到O(n)。但这种情况非常罕见,通常可以忽略不计。 ```python # 示例:通过键访问字典中的值 def access_dict_by_key(d, key): return d[key] # 平均时间复杂度:O(1) # 最坏时间复杂度:O(n) ``` ##### 2.2 字典插入/删除(O(1) 平均情况) 在字典中插入或删除键值对的操作,同样在平均情况下是O(1)的,但最坏情况下也可能退化到O(n)。 ```python # 示例:向字典中添加键值对 def insert_to_dict(d, key, value): d[key] = value # 平均时间复杂度:O(1) # 最坏时间复杂度:O(n) ``` #### 3. 集合操作 ##### 3.1 集合添加/删除元素(O(1) 平均情况) 集合(set)是Python中的一种无序不重复元素集,添加或删除元素的操作在平均情况下是O(1)的,但同样受到哈希表性能的影响,最坏情况下可能达到O(n)。 ```python # 示例:向集合中添加元素 def add_to_set(s, element): s.add(element) # 平均时间复杂度:O(1) # 最坏时间复杂度:O(n) ``` ##### 3.2 集合交集/并集/差集(O(n + m)) 当使用集合的交集(`&`)、并集(`|`)、差集(`-`)等操作时,其时间复杂度通常是O(n + m),其中n和m分别是两个集合中元素的数量。这是因为算法需要遍历两个集合中的所有元素来找出满足条件的元素。 ```python # 示例:计算两个集合的并集 def union_sets(s1, s2): return s1 | s2 # 时间复杂度:O(n + m) ``` #### 4. 字符串操作 ##### 4.1 字符串连接(O(n + m)) 在Python中,字符串是不可变的,因此每次连接(拼接)操作都会创建一个新的字符串对象。如果通过`+`操作符连接n个字符串,总的时间复杂度将是O(n^2),因为每次连接都会复制之前的所有字符串。然而,使用`join()`方法可以显著提高效率,其时间复杂度为O(n + m),其中n是分隔符的数量(对于单次连接操作可视为1),m是所有待连接字符串中字符的总数。 ```python # 示例:使用join()连接字符串列表 def join_strings(strings, separator): return separator.join(strings) # 时间复杂度:O(n + m),其中n为separator的长度(通常很小),m为所有strings中字符的总数 ``` ##### 4.2 字符串索引访问(O(1)) 与列表类似,通过索引访问字符串中的字符也是O(1)的操作。 ```python # 示例:通过索引访问字符串中的字符 def access_string_by_index(s, index): return s[index] # 时间复杂度:O(1) ``` #### 5. 递归函数 递归函数的时间复杂度分析相对复杂,因为它依赖于递归的深度和每一层递归的工作量。一个典型的例子是斐波那契数列的计算,如果使用朴素的递归方法,其时间复杂度会达到指数级(O(2^n)),但通过记忆化或动态规划等技术可以优化到O(n)。 ```python # 示例:斐波那契数列的朴素递归实现(不推荐,仅用于说明) def fibonacci_recursive(n): if n <= 1: return n else: return fibonacci_recursive(n-1) + fibonacci_recursive(n-2) # 时间复杂度:O(2^n) # 优化后的版本(使用记忆化) def fibonacci_memo(n, memo={}): if n in memo: return memo[n] if n <= 1: return n memo[n] = fibonacci_memo(n-1, memo) + fibonacci_memo(n-2, memo) return memo[n] # 优化后时间复杂度:O(n) ``` #### 总结 了解常见函数调用的大O阶是优化Python代码性能的重要基础。通过选择合适的数据结构和算法,可以显著降低程序的运行时间,提升用户体验。本章节介绍了列表、字典、集合、字符串以及递归函数等常见操作的大O阶,希望能够帮助读者在实际编程中做出更明智的选择。记住,大O阶分析是理解算法性能的一种工具,但它并不是唯一的工具,实际编程中还需要考虑空间复杂度、代码可读性、可维护性等多个方面。
上一篇:
13.5.2 大O 分析实例
下一篇:
13.5.4 一眼看出大O 阶
该分类下的相关小册推荐:
Python爬虫入门与实战开发(上)
Python数据分析与挖掘实战(下)
Python高性能编程与实战
Python高并发编程与实战
Python机器学习基础教程(下)
Python编程轻松进阶(三)
Python与办公-玩转Word
Python合辑6-字典专题
Python与办公-玩转PPT
剑指Python(磨刀不误砍柴工)
Python甚础Django与爬虫
Python编程轻松进阶(二)