python - 将函数绑定到本地范围内的名称的好处?
问题描述
我大约一天前读过一些东西,不记得在哪里,帖子的作者指出,最好将函数调用绑定到本地空间中的名称,而不是进行.
访问调用。
例如:
def foo():
a = math.cos
b = math.sin
x = a(1) * b(0)
对比
def foo():
x = math.cos(1) * math.sin(0)
现在这是在性能的背景下,如果这些调用不止一次,但它让我想知道为什么它的性能更好,什么时候应该这样使用它?这样做不只是开始弄乱命名空间吗?
解决方案
我做了一些分析以了解它们之间的实际区别是什么。你可以在这里 从 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
令我惊讶的是,本地名称比全局名称的性能要好得多。两者都大大优于其他属性查找。
推荐阅读
- mysql - 如何将 sql join 查询转换为 sequelizejs 查询
- node.js - SPFX 站点(SharePoint 2016 本地站点与反应)不断重新加载。该怎么办?
- docker - 使用 ENV 参数设置容器 PATH
- django - 如何在django中借助Forign Key访问其他模型的所有字段
- spring - 如何使用 Spring Pageable 在自定义查询 JPQL 上对多个字段执行排序
- android - Flutter:显示 PDF 封面图片
- selenium - 如何参考第一列中的名称启用第二列中的复选框?
- drupal - Drupal 8 如何创建 ajax_deliver 路由回调?
- typescript - TypeScript中“typeof SomeClass”作为返回参数的解释
- java - 下面的模式要使用什么符号来编译