首页
技术小册
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 确定代码的大O阶 在编程领域,性能优化是每一位开发者必须掌握的技能之一,尤其是在处理大规模数据时。而理解并评估算法的时间复杂度,即“大O阶”(Big O Notation),是性能分析中的关键步骤。大O阶不仅帮助我们理解算法在数据规模增长时的表现,还指导我们在设计算法时做出更优的选择。本章将深入探讨如何确定Python代码中各种操作的大O阶,并通过实例加以说明。 #### 13.5.1 大O阶基础 大O阶是一种描述算法时间复杂度的数学表示法,它关注于算法执行时间随输入规模增长而增长的趋势,而忽略具体的常数项和低阶项。其基本形式为O(f(n)),其中n是输入规模(如数组的长度、图的节点数等),f(n)是一个关于n的函数,表示算法所需时间或空间与n的关系。常见的大O阶有O(1)、O(log n)、O(n)、O(n^2)、O(n log n)和O(2^n)等。 #### 13.5.2 分析步骤 要确定一个算法的大O阶,通常遵循以下步骤: 1. **理解算法逻辑**:首先,需要清晰理解算法的执行流程和每一步的操作。 2. **识别关键操作**:在算法中,找出那些执行次数与输入规模直接相关的操作,这些通常是循环、递归调用等。 3. **计算操作次数**:尝试用数学表达式表示出这些关键操作的执行次数与输入规模n的关系。 4. **应用大O阶规则**:忽略常数项和低阶项,只保留最高阶项,并忽略其系数,得到算法的大O阶。 #### 13.5.3 实例分析 接下来,我们通过几个Python代码实例来具体说明如何确定大O阶。 ##### 13.5.3.1 线性搜索 ```python def linear_search(arr, target): for i in range(len(arr)): if arr[i] == target: return i return -1 ``` - **理解算法逻辑**:遍历数组,比较每个元素是否等于目标值。 - **识别关键操作**:循环体内的比较操作。 - **计算操作次数**:循环执行len(arr)次,即n次。 - **应用大O阶规则**:O(n)。 ##### 13.5.3.2 二分搜索 ```python def binary_search(arr, target): low, high = 0, len(arr) - 1 while low <= high: mid = (low + high) // 2 if arr[mid] < target: low = mid + 1 elif arr[mid] > target: high = mid - 1 else: return mid return -1 ``` - **理解算法逻辑**:在有序数组中,通过不断缩小搜索范围来查找目标值。 - **识别关键操作**:每次循环都将搜索范围减半。 - **计算操作次数**:每次循环后,搜索范围变为原来的一半,因此循环次数约为log2(n)。 - **应用大O阶规则**:O(log n)。 ##### 13.5.3.3 冒泡排序 ```python def bubble_sort(arr): n = len(arr) for i in range(n): for j in range(0, n-i-1): if arr[j] > arr[j+1]: arr[j], arr[j+1] = arr[j+1], arr[j] ``` - **理解算法逻辑**:通过重复遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。 - **识别关键操作**:内层循环的比较和可能的交换操作。 - **计算操作次数**:外层循环n次,内层循环n-1, n-2, ..., 1次,总操作次数约为n(n-1)/2。 - **应用大O阶规则**:O(n^2)。 ##### 13.5.3.4 嵌套循环 ```python def nested_loops(n): sum = 0 for i in range(n): for j in range(i, n): sum += 1 return sum ``` - **理解算法逻辑**:外层循环控制i从0到n-1,内层循环从i遍历到n-1。 - **识别关键操作**:内层循环的每次迭代。 - **计算操作次数**:内层循环执行次数随i增加而增加,总次数为1+2+...+(n-1)=n(n-1)/2。 - **应用大O阶规则**:O(n^2)。 #### 13.5.4 注意事项 - **最坏情况与平均情况**:通常我们关注算法的最坏情况时间复杂度,因为它提供了性能保证。但在某些情况下,了解平均情况或最好情况也很有价值。 - **空间复杂度**:除了时间复杂度,还需要考虑算法的空间复杂度,即算法执行过程中所需的最大空间(包括存储输入、输出和辅助变量所需的空间)。 - **常数项与低阶项**:在评估大O阶时,这些项被忽略,因为它们不会随着n的增长而显著影响算法的整体性能。 - **递归算法**:对于递归算法,除了直接分析递归过程外,还可以尝试将其转换为迭代形式或使用递推关系式来求解时间复杂度。 #### 13.5.5 结论 确定代码的大O阶是理解其性能特性、进行算法优化和选择适当数据结构的关键步骤。通过掌握大O阶的基本概念和分析方法,我们可以更加有效地设计和评估算法,从而在处理大规模数据时获得更好的性能。希望本章内容能帮助读者在Python编程进阶之路上更进一步。
上一篇:
13.4.2 大O 测量的是最坏情况
下一篇:
13.5.1 为什么低阶项和系数不重要
该分类下的相关小册推荐:
Python合辑11-闭包函数
剑指Python(磨刀不误砍柴工)
Python高并发编程与实战
Python数据分析与挖掘实战(下)
Python3网络爬虫开发实战(上)
Python编程轻松进阶(四)
Python高性能编程与实战
Python与办公-玩转PPT
Python合辑14-面向对象编程案例(下)
Python合辑3-字符串用法深度总结
Python编程轻松进阶(二)
Python面试指南