在Python库中声明现有数据类型

时间:2014-11-01 08:01:42

标签: python performance python-2.7

我经常在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

更快

1 个答案:

答案 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}}。