为什么Python';s';len';功能比____________方法更快?
在Python中,为什么Python';s';len';功能比____________方法更快?,python,python-internals,Python,Python Internals,在Python中,len是一个函数,通过调用对象的\uuuu len\uuu方法来获取集合的长度: def len(x): return x.__len__() 因此,我希望直接调用\uu len\uu()至少与len()一样快 但是使用上述代码的测试结果显示len()更快。为什么?内置的len()函数不查找\uuu len\uuu属性。它会查找,而这又有一个 内置对象上的属性是间接的,而间接(加上属性查找)需要更多的时间 对于Python定义的类,type对象在请求sq\u长度时查
len
是一个函数,通过调用对象的\uuuu len\uuu
方法来获取集合的长度:
def len(x):
return x.__len__()
因此,我希望直接调用\uu len\uu()
至少与len()
一样快
但是使用上述代码的测试结果显示len()
更快。为什么?内置的len()
函数不查找\uuu len\uuu
属性。它会查找,而这又有一个
内置对象上的属性是间接的,而间接(加上属性查找)需要更多的时间
对于Python定义的类,type
对象在请求sq\u长度
时查找\uuu len\uuu
方法。
比len()
慢,因为\uu len\uu
涉及dict查找。可能重复@GamesBrainiac的问题是关于相反的观察结果。旁白:使用设置的目的是确保您只对您感兴趣的内容进行计时。如果您希望时间设置a
+而不是获取长度,这很好,但是您根本不需要设置a
。如果长度保持不变并且必须多次查找,则将其存储在整数n=len(a)中
和使用n
。这就提出了一个问题,即len
如何避免dict查找,我认为在不解释这一点的情况下,OP(或任何其他还不知道如何操作的人)并不是特别有用。
import timeit
setup = '''
'''
print (timeit.Timer('a="12345"; x=a.__len__()', setup=setup).repeat(10))
print (timeit.Timer('a="12345"; x=len(a)', setup=setup).repeat(10))