# 前言

最近搬砖的工作涉及到很多基础的 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() 是一个时间复杂度为 O(n)O(n) 的操作,它需要从头开始遍历整个数组的内存空间,直到到达数组尾部。
而创建列表时原地赋值则是 O(1)O(1) 时间复杂度的操作,差距显而易见。
在添加了 if 判断语句之后,虽然循环的次数没有变化,甚至还多了 if 判断的操作,但是 append() 的次数却显著减少了。

# 结论

  • 列表生成式方法比 for-append 写法快得多。
  • 列表生成式方法之所以比 for-append 写法快,是由于 append() 的时间复杂度为 O(n)O(n) ,而原地赋值的时间复杂度为 O(1)O(1)

# 内置函数

# 生成器

# 多重赋值

# itertools 模块

# LRU Cache 缓存

更新于

请我喝[茶]~( ̄▽ ̄)~*

錦木 千束 微信支付

微信支付