gpt4 book ai didi

Python:为什么将函数名称复制到本地 namespace 会导致更快的访问

转载 作者:太空狗 更新时间:2023-10-30 01:11:11 25 4
gpt4 key购买 nike

来自此处的代码:https://www.learnsteps.com/increasing-performance-python-code/

import datetime 
alist = [str(x) for x in range(100000000)]

print("\nStandard loop.")
a = datetime.datetime.now()
result = []
for item in alist:
result.append(len(item))
b = datetime.datetime.now()
print((b-a).total_seconds())

print("\nStandard loop with function name in local namespace.")
a = datetime.datetime.now()
result = []
fn = len
for item in alist:
result.append(fn(item))
b = datetime.datetime.now()
print((b-a).total_seconds())

print("\nUsing map.")
a = datetime.datetime.now()
result = list(map(len, alist))
b = datetime.datetime.now()
print((b-a).total_seconds())

print("\nUsing map with function name in local namespace.")
a = datetime.datetime.now()
fn = len
result = list(map(fn, alist))
b = datetime.datetime.now()
print((b-a).total_seconds())

print("\nList comprehension.")
a = datetime.datetime.now()
result = [len(i) for i in alist]
b = datetime.datetime.now()
print((b-a).total_seconds())
print("\nList comprehension with name in local namespace.")

a = datetime.datetime.now()
fn = len
result = [fn(i) for i in alist]
b = datetime.datetime.now()
print((b-a).total_seconds())

产生这个输出:

Standard loop.
20.862797

Standard loop with function name in local namespace.
16.34087

Using map.
6.893764

Using map with function name in local namespace.
6.774654

List comprehension.
9.362831

List comprehension with name in local namespace.
10.007393

有人可以提供比“函数查找成本高”更好的解释,说明为什么创建接近函数使用的函数原型(prototype)会更快吗?(这对大多数函数不起作用,通常只在紧密循环中起作用,但为什么会发生这种情况呢?)

最佳答案

这是因为名称解析首先从本地命名空间开始,如果在本地找不到,则会在下一个最近的封闭代码块中查找,然后是下一个最近的封闭代码块,直到模块代码block,这是全局命名空间,如果在全局命名空间中找不到该名称,那么解释器将查找内置名称。这就是为什么将对内置名称 len 的引用分配给全局名称 fn 会加快代码示例中的名称解析。

关于Python:为什么将函数名称复制到本地 namespace 会导致更快的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53127133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com