
写Python的人常遇到运行慢。程序跑起来像背着沙袋走路。有人建议加缓存。缓存确实快。它把算完的结果存起来,下次直接拿。可缓存有代价。内存吃紧。数据会旧。代码变复杂。今天不讲缓存。讲三个改代码本身的技巧。它们不存结果,只改干活的方式。改完速度能上去。
第一个技巧:把循环里的重复计算拎出来。看下面这段。
import mathfor i in range(1000000): result = math.sqrt(i) * math.pi data.append(result)
math.pi每次循环都去取。它是个固定值。取一次就够。改成这样。
pi = math.pifor i in range(1000000): result = math.sqrt(i) * pi data.append(result)
取属性有开销。每次循环都取,累加起来不少。把不随循环变的值放到外面。这个动作叫循环不变量外提。编译器有时会做。Python解释器不帮你做。自己动手。测一下,上面例子快百分之十五左右。循环越大,省得越多。
第二个技巧:用局部变量代替全局变量。Python查变量按顺序找。先在局部找,再去全局,最后去内置。局部在函数里。全局在模块层。查局部快得多。看这个。
count = 0def increment(): global count for _ in range(1000000): count += 1
每次count += 1都要去全局区拿count。改一下。
def increment(): local_count = 0 for _ in range(1000000): local_count += 1 return local_count
用局部变量算完再返回。速度差多少?实测能快两倍以上。有人把常用函数也塞进局部。比如把len赋给一个局部名。len是内置函数。查它也要时间。放局部就快。写法是l = len。后面用l(x)。这招在循环里特别管用。
第三个技巧:换数据结构。列表和集合查东西的速度差很多。列表查一个元素在不在,要一个个看。集合用哈希表,一步到位。看例子。
items = list(range(100000))targets = list(range(50000))for t in targets: if t in items: pass
这个if t in items很慢。items是列表,每次查都要扫。把items改成集合。
items = set(range(100000))targets = list(range(50000))for t in targets: if t in items: pass
速度提升几十倍。集合牺牲了顺序,换来了查找快。如果只关心存在性,不关心顺序,就用集合。字典也一样。查键快。列表适合按位置取。选数据结构看操作。频繁查成员,集合或字典。频繁按索引取,列表。
这三个技巧不碰缓存。它们改的是代码的写法。循环外提减少重复取属性。局部变量减少查找层级。换数据结构改变查找方式。每个都简单。改完跑一下,用timeit测时间。别靠感觉。感觉会骗人。测出来的数字才真实。
以上就是“Python性能优化:3个技巧让你的代码提速10倍!”的详细内容,想要了解更多Python教程欢迎持续关注编程学习网。
扫码二维码 获取免费视频学习资料

- 本文固定链接: http://www.phpxs.com/post/14528/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料