我经常在Python 2.7的random
模块中找到以下行:
_int = int
在该行之后,代码使用新类型_int
而不是int
。例如:
def shuffle(self, x, random=None):
if random is None:
random = self.random
_int = int
for i in reversed(xrange(1, len(x))):
# pick an element in x[:i+1] with which to exchange x[i]
j = _int(random() * (i+1))
x[i], x[j] = x[j], x[i]
在string
模块中,我发现了这个:
####################################################################
# NOTE: Everything below here is deprecated. Use string methods instead.
# This stuff will go away in Python 3.0.
[..]
# for a bit of speed
_float = float
_int = int
_long = long
为什么图书馆使用_int
代替int
?为什么这比仅使用内置int
?
答案 0 :(得分:4)
全局变量总是按名称查找,而局部变量可以通过索引访问,这要快得多。
插图:
>>> def foo(s):
... return int(s)
...
>>> def bar(s, int=int):
... return int(s)
...
>>> import dis
>>> dis.dis(foo)
2 0 LOAD_GLOBAL 0 (int)
3 LOAD_FAST 0 (s)
6 CALL_FUNCTION 1
9 RETURN_VALUE
>>> dis.dis(bar)
2 0 LOAD_FAST 1 (int)
3 LOAD_FAST 0 (s)
6 CALL_FUNCTION 1
9 RETURN_VALUE
以上作为微优化工作,因为本地int
在函数定义期间得到解析,而不是函数执行。
在您的示例中,_int = int
在函数执行期间完成,因此您在调用shuffle时仍需要通过int
获取LOAD_GLOBAL
,但是每次连续调用{{循环内部{1}}。