首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第4章 选择易懂的名称
4.1 命名风格
4.2 PEP 8 的命名风格
4.3 适当的名称长度
4.3.1 太短的名称
4.3.2 太长的名称
4.4 起易于搜索的名称
4.5 避免笑话、双关语和需要文化背景才能理解的词汇
4.6 不要覆盖内置名称
4.7 史上最差的变量名
第5章 揪出代码的坏味道
5.1 重复的代码
5.2 魔数
5.3 注释掉的代码和死代码
5.4 打印调试
5.5 带有数字后缀的变量
5.6 本该是函数或者模块的类
5.7 嵌套列表解析式
5.8 空的except块和糟糕的错误信息
5.9 代码坏味道的谬误
5.9.1 谬误:函数应该仅在末尾处有一个return语句
5.9.2 谬误:函数最多只能有一个try语句
5.9.3 谬误:使用flag参数不好
5.9.4 谬误:全局变量不好
5.9.5 谬误:注释是不必要的
第6章 编写Python 风格的代码
6.1 Python 之禅
6.2 学着喜欢强制缩进
6.3 使用timeit模块衡量性能
6.4 常被误用的语法
6.4.1 使用enumerate()而不是range()
6.4.2 使用with 语句代替open()和close()
6.4.3 用is 跟None 做比较而不用==
6.5 格式化字符串
6.5.1 如果字符串有很多反斜杠,请使用原始字符串
6.5.2 使用f-string 格式化字符串
6.6 制作列表的浅副本
6.7 以Python 风格使用字典
6.7.1 在字典中使用get()和setdefault()
6.7.2 使用collections.defaultdict()设置默认值
6.7.3 使用字典代替switch 语句
6.8 条件表达式:Python“丑陋”的三元运算符
6.9 处理变量的值
6.9.1 链式赋值和比较运算符
6.9.2 验证变量是否为多个值中的一个
当前位置:
首页>>
技术小册>>
Python编程轻松进阶(二)
小册名称:Python编程轻松进阶(二)
### 6.3 使用`timeit`模块衡量性能 在Python编程的进阶之路上,对代码性能的评估与优化是不可或缺的一环。无论是为了提升用户体验,还是满足高并发场景下的性能要求,准确测量并优化代码执行时间都是至关重要的。Python标准库中的`timeit`模块为此提供了强大的支持,它允许开发者以简单而精确的方式测试小段代码的执行时间,是性能分析中的一把利器。 #### 6.3.1 `timeit`模块简介 `timeit`模块是Python标准库的一部分,旨在提供一个简单的方法来测量小段Python代码的执行时间。它通过多次执行代码片段,自动计算平均执行时间,以减少单次执行时可能出现的系统波动或噪声影响,从而给出更为可靠的执行时间数据。此外,`timeit`还提供了灵活的接口,允许用户从命令行或程序内部直接使用其功能。 #### 6.3.2 命令行使用`timeit` 最直接的使用`timeit`的方式是通过命令行。这种方式非常适合快速测试小段代码的执行效率。基本语法如下: ```bash python -m timeit '<statement>' ``` 或者,如果你的测试代码包含多行,可以使用`-s`选项来指定一个或多个导入语句或初始化语句,并通过引号包围多行代码: ```bash python -m timeit -s 'import numpy as np' 'a = np.arange(1000); a.sum()' ``` 在命令行中,`timeit`默认会执行测试语句多次(通常是数百万次),并计算平均执行时间,以确保结果的准确性。你可以通过`-n`选项来指定执行次数。 #### 6.3.3 编程中使用`timeit` 除了在命令行中使用外,`timeit`模块还提供了丰富的API,允许你在Python脚本或程序中直接调用其功能,进行更复杂的性能测试。 ##### 6.3.3.1 使用`Timer`类 `timeit.Timer`类是`timeit`模块的核心,它接受两个字符串参数:`stmt`(要测试的语句)和`setup`(测试前需要执行的设置语句,如导入模块、定义变量等)。然后,你可以使用`timeit()`方法执行测试,该方法接受一个可选的`number`参数来指定测试次数。 ```python import timeit # 使用Timer类 stmt = "a = [i*2 for i in range(1000)]" setup = "pass" # 如果没有设置需求,可以留空 # 创建一个Timer对象 t = timeit.Timer(stmt=stmt, setup=setup) # 执行测试,默认执行1000000次 time_taken = t.timeit(number=10000) print(f"Execution time: {time_taken} seconds") ``` ##### 6.3.3.2 使用`timeit.timeit()`函数 除了使用`Timer`类,`timeit`模块还提供了一个便捷的`timeit()`函数,它直接接受`stmt`和`setup`作为参数,以及可选的`number`和`globals`参数。这个函数内部实际上是创建了一个`Timer`对象并调用了其`timeit()`方法。 ```python # 使用timeit.timeit()函数 stmt = "a = [i*2 for i in range(1000)]" time_taken = timeit.timeit(stmt=stmt, number=10000) print(f"Execution time: {time_taken} seconds") ``` #### 6.3.4 注意事项与最佳实践 - **测试环境的稳定性**:在性能测试前,确保你的测试环境(如CPU、内存等)处于稳定状态,避免外部因素干扰测试结果。 - **多次测试取平均**:虽然`timeit`默认会多次执行测试语句并计算平均值,但在某些极端情况下,你可能需要手动调整测试次数以获得更精确的结果。 - **避免测试系统级操作**:`timeit`最适合用于测试Python代码片段的性能,而不是系统级操作(如文件读写、网络请求等),因为这些操作可能受到多种外部因素的影响。 - **关注相对性能而非绝对时间**:在大多数情况下,我们更关心代码片段之间的性能差异,而非它们的绝对执行时间。因此,在对比不同实现时,重点应放在它们的性能比例上。 - **结合其他工具使用**:`timeit`虽然强大,但它只提供了执行时间的测量。在需要深入分析性能瓶颈时,你可能还需要结合`cProfile`、`memory_profiler`等其他工具进行更全面的性能分析。 #### 6.3.5 实战演练 假设我们有两个函数,分别用于计算列表中所有元素的和,一个使用纯Python循环,另一个使用NumPy库。我们可以使用`timeit`来比较这两个函数的性能。 ```python import numpy as np import timeit def sum_python(lst): total = 0 for num in lst: total += num return total def sum_numpy(arr): return np.sum(arr) # 创建一个包含10000个随机整数的列表 lst = [np.random.randint(1, 100) for _ in range(10000)] arr = np.array(lst) # 使用timeit测试两个函数的性能 time_python = timeit.timeit(lambda: sum_python(lst), number=100) time_numpy = timeit.timeit(lambda: sum_numpy(arr), number=100) print(f"Sum using pure Python: {time_python} seconds") print(f"Sum using NumPy: {time_numpy} seconds") ``` 通过这个实战演练,我们可以直观地看到使用NumPy进行数组运算在性能上的优势,进一步加深了对`timeit`模块的理解和应用。 总之,`timeit`模块是Python性能分析中的一个重要工具,它以其简单、准确、灵活的特点,在代码性能调优过程中发挥着不可替代的作用。掌握`timeit`的使用方法,将帮助你更好地理解和优化你的Python代码。
上一篇:
6.2 学着喜欢强制缩进
下一篇:
6.4 常被误用的语法
该分类下的相关小册推荐:
Python爬虫入门与实战开发(上)
Python合辑4-130个字符串操作示例
Python合辑9-判断和循环
Python机器学习基础教程(下)
Python编程轻松进阶(一)
Python合辑5-格式化字符串
Python合辑3-字符串用法深度总结
Python与办公-玩转Excel
Python合辑6-字典专题
Python合辑8-变量和运算符
Python合辑13-面向对象编程案例(上)
Python合辑14-面向对象编程案例(下)