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

2024-04-19 18:42:22 发布

您现在位置:Python中文网/ 问答频道 /正文

从这里的代码: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

对于为什么创建一个接近函数使用的函数原型会更快,有人能提供一个比“函数查找是昂贵的”更好的解释吗? (这对大多数函数都不起作用,通常只在紧循环中起作用,但为什么会发生这种情况?)你知道吗


Tags: nameinmapdatetimelenlocalwithresult
1条回答
网友
1楼 · 发布于 2024-04-19 18:42:22

这是因为名称解析首先从本地名称空间开始,如果在本地找不到,则会在下一个最近的封闭代码块中查找,然后在下一个最近的封闭代码块中查找,直到模块代码块(即全局名称空间)为止,如果在全局名称空间中找不到名称,只有这样,解释器才会查找内置名称。这就是为什么在代码示例中将对内置名称len的引用分配给全局名称fn会加快名称解析的速度。你知道吗

相关问题 更多 >