可能是自己做性能测试这块的缘故,平时在写脚本或者代码的时候,脑子中总是会想我这样写出来的效率高吗?总想用更高效的方法去实现同一个功能?可能互联网人多多少少有一点点的强迫症吧,今天就和大家分享实践下几种 python 不同的执行效率的写法,作为有追求的技术人员,不能仅仅局限于完成功能,更多内容可以学习《测试工程师 Python 工具开发实战》书籍。
一、效率对比
一个功能的实现,可以用多种语句来实现,比如说:while 语句、for 语句、生成器、列表推导、内置函数等实现,然而他们的效率并不一样。可以写一个小程序来测试它们执行的效率。
二、代码内容
将一个数字大小为 20 万的数字,依次取绝对值,放到列表中,测试重复 1 千次。
演示 Python 的对比代码
# encoding: utf-8
@python: v3.5.4
@author: hutong
@file: comparePerf.py
@time: 2019/3/17 下午12:16
import time, sys
reps = 1000 # 测试重复次数
nums = 200000 # 测试时数字大小
def tester(func, *args): # 总体测试函数
startTime = time.time()
for i in range(reps):
func(*args)
elapsed = time.time() - startTime # 用time模块来测试,结束时间与开始时间差
return elapsed
def while_Statement(): # while循环实现
res = []
x = 0
while nums > x:
x += 1
res.append(abs(x))
def for_Statement(): # for循环实现
res = []
for x in range(nums):
res.append(abs(x))
def generator_Expression(): # 生成器实现
res = list(abs(x) for x in range(nums))
def list_Comprehension(): # 列表解析实现
res = [abs(x) for x in range(nums)]
if __name__ == "__main__":
print(sys.version) # 打印系统版本
tests = [while_Statement, for_Statement, generator_Expression, list_Comprehension]
for testfunc in tests: # 将待测函数放置列表中依次遍历
print(testfunc.__name__.ljust(20), ': ', tester(testfunc))
测试结果是发现利用 python 的列表推导比常见的 for 循环,while 循环要快很多。分析了下原因:列表推导内的迭代在解释器内是以 C 语言的速度运行的 (一般是 for 循环的两倍,对大型文件操作而言,用列表推导效果尤其明显), while 语句是纯粹用 Python 代码写成,所以速度最慢。