首页 > 解决方案 > 将函数绑定到本地范围内的名称的好处?

问题描述

我大约一天前读过一些东西,不记得在哪里,帖子的作者指出,最好将函数调用绑定到本地空间中的名称,而不是进行.访问调用。

例如:

def foo():
    a = math.cos
    b = math.sin
    x = a(1) * b(0)

对比

def foo():
    x = math.cos(1) * math.sin(0)

现在这是在性能的背景下,如果这些调用不止一次,但它让我想知道为什么它的性能更好,什么时候应该这样使用它?这样做不只是开始弄乱命名空间吗?

标签: pythonpython-3.x

解决方案


我做了一些分析以了解它们之间的实际区别是什么。你可以在这里 从 timeit import timeit找到 REPL

import math
from math import sin

x = 10_000_000


def from_import():
    for _ in range(x):
        sin(100)


def import_module():
    for _ in range(x):
        math.sin(100)


def local_var():
    s = math.sin
    for _ in range(x):
        s(100)


def local_import():
    from math import sin
    for _ in range(x):
        sin(100)


funcs = (from_import, import_module, local_var, local_import)

for func in funcs:
    print("{:<15} {}".format(
        func.__name__, timeit(
            func.__name__ + '()', number=1, globals=globals())))

结果:

from_import     4.354339323996101
import_module   5.608195230990532
local_var       3.982630196987884
local_import    3.9956486110022524

令我惊讶的是,本地名称比全局名称的性能要好得多。两者都大大优于其他属性查找。


推荐阅读