Python 效率的一个问题是该语言是完全动态的。例如考虑简单的循环
def myfunc():
for i in range(10):
foo(bar(i))
似乎该函数foo
将被调用bar
十次。然而,函数bar
可以例如改变什么foo
,而代码foo
又可以改变什么bar
。因此,Python 被迫在每次迭代时检查foo
指向什么以及指向什么bar
。这需要查看模块全局变量,如果在内置(预定义)名称中找不到任何内容。在 10 次迭代中的每一次。
所有全局查找都会发生同样的情况(例如,您甚至可以定义一个名为len
“隐藏”具有该名称的标准函数的函数)。
当使用局部变量时,事情会更简单
def myfunc():
f = foo
b = bar
for i in range(10):
f(b(i))
原因是f
andb
是局部变量,因此获取能够进行调用的值要简单得多。外部的代码myfunc
无法更改f
和b
指向的内容。
因此,获得一些速度的一个技巧是编写类似的东西
def myfunc(x, sin=math.sin):
...
这样在使用的时候sin
就不用先抬头math
再往sin
里看math
。
这是一种微优化,但被认为是不好的风格,除非你真的发现(测量)速度是一个问题,修复已被测量以提供合理的收益,但速度缓慢并不足以严重到需要更多激进的做法。