为什么Python';s';len';功能比____________方法更快?

为什么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长度时查

在Python中,
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))