# 前言
最近搬砖的工作涉及到很多基础的 python 策略代码,因此一时兴起上网查了查 python 代码优化的方案。
本文一方面是汇总一些提升代码性能的编码技巧,更主要的是验证它们有效与否,顺便试着推理它们有效或者无效的原因。
# 列表生成式 (2022/8/26)
# 应用场景
创建一个有规律的数组,并且为了实现这个规律不得不使用 for 循环的时候。例如: [1*1,2*2,3*3,...,n*n]
, 其中 n=1000
。
# 传统方案 vs 列表生成式方案
res = [] | |
for i in range(1, 1000000): | |
res.append(i*i) | |
time elapsed:0.127601s |
res = [i*i for i in range(1,1000000)] | |
time elapsed:0.061128s |
结果显示,使用列表生成式的代码执行速度比使用 for 循环 append 快了不止一倍。而对于更大的 n 值,这一结论同样适用。
因此列表生成式在效率上的优势是显而易见的。
进一步地,在有 if 判断的场景下考察两者的差别。
res = [] | |
for i in range(1, 1000000): | |
if i % 2 == 0: | |
res.append(i*i) | |
time elapsed:0.109248s |
res = [i*i for i in range(1, 1000000) if i % 2 == 0] | |
time elapsed:0.061044s |
不难发现,列表生成式方案的耗时几乎没有变化,而传统方案则明显变快了。
由此可以推断出一个结论,传统方案之所以慢是由于 append()
效率较低所致。
事实上, append()
是一个时间复杂度为 的操作,它需要从头开始遍历整个数组的内存空间,直到到达数组尾部。
而创建列表时原地赋值则是 时间复杂度的操作,差距显而易见。
在添加了 if
判断语句之后,虽然循环的次数没有变化,甚至还多了 if
判断的操作,但是 append()
的次数却显著减少了。
# 结论
- 列表生成式方法比 for-append 写法快得多。
- 列表生成式方法之所以比 for-append 写法快,是由于
append()
的时间复杂度为 ,而原地赋值的时间复杂度为 。