大约一天前,我读过一些东西,不记得在哪里,该帖子的作者指出,将函数调用绑定到本地空间中的名称比进行.
访问调用更好
例如:
def foo():
a = math.cos
b = math.sin
x = a(1) * b(0)
vs
def foo():
x = math.cos(1) * math.sin(0)
现在这是在性能的上下文中,并且这些调用是否多次执行,但是让我想知道为什么它的性能会更好,何时应该像这样使用?这样做不是只是开始混乱命名空间吗?
答案 0 :(得分:1)
我做了一些分析,以了解两者之间的实际区别。您可以find the REPL here 从timeit导入timeit
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
令我惊讶的是,本地名称比全局名称的性能要好得多。两者都大大优于其他属性查找。