编程语言
首页 > 编程语言> > 为什么Python的’len’函数比__len__方法更快?

为什么Python的’len’函数比__len__方法更快?

作者:互联网

Python中,len是一个函数,通过调用对象的__len__方法来获取集合的长度:

def len(x):
    return x.__len__()

所以我希望__len __()的直接调用至少和len()一样快.

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))

Demo link

但是使用上面代码测试的结果显示len()更快.为什么?

解决方法:

内置的len()函数不会查找.__ len__属性.它查找tp_as_sequence pointer,而tp_as_sequence pointer又是sq_length attribute.

内置对象的.__ len__属性是间接的mapped to the same slot,而间接(加上属性查找)需要花费更多时间.

对于Python定义的类,当请求sq_length时,类型对象会查找.__ len__方法.

标签:python,python-internals
来源: https://codeday.me/bug/20191001/1838197.html