为什么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))
但是使用上面代码测试的结果显示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