程序运行太慢,想要提速,但不使用复杂的技术如 C 扩展或 JIT 编译器。
解决方案
程序优化的第一准则是“不要优化”,第二准则是“不要优化那些不重要的部分”。基于这两个原则,如果你的程序运行得很慢,你得先找出影响性能的问题所在。
多数时候我们发现程序把大量的时间花在几个热点位置,比如处理数据的内层循环。一旦确认了这些热点,就可以使用以下各小节中介绍的技术让程序运行得更快。
使用函数
很多人开始使用 Python 时都是用它来编写一些简单的脚本。最开始时,很容易陷入只管编写代码而不重视程序结构的怪圈。例如:
# somescript.py
import sys
import csv
with open(sys.argv[1]) as f:
for row in csv.reader(f):
# Some kind of processing
pass
一个鲜为人知的事实是,像上面这样定义在全局范围内的代码比定义在函数中的代码要慢。速度的差异与局部变量与全局变量的实现机制有关(涉及局部变量的操作要更快)。因此,如果想让程序运行得更快,可以将脚本中的语句放入函数中即可:
# somescript.py
import sys
import csv
def main(filename):
with open(filename) as f:
for row in csv.reader(f):
# Some kind of processing
pass
main(sys.argv[1])
运行速度的差异与具体执行的任务有关,但根据经验,提升 15% ~ 30% 的情况很常见。
消除属性访问
每次使用句点操作符(.)来访问对象的属性都会带来开销。在底层,这会触发调用特殊的方法。
通常可以用 from module import name 的导入形式以及选择性地使用绑