在Python中,len是一个通过调用对象的__len__方法来获取集合长度的函数:
def len(x):
return x.__len__()
Run Code Online (Sandbox Code Playgroud)
所以我希望直接呼叫__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))
Run Code Online (Sandbox Code Playgroud)
但使用上述代码进行测试的结果显示len()更快.为什么?
据我所知,括号只不过是一个包装器__getitem__.以下是我对此进行基准测试的方法:
首先,我生成了一个半大字典.
items = {}
for i in range(1000000):
items[i] = 1
Run Code Online (Sandbox Code Playgroud)
然后,我使用cProfile测试以下三个函数:
def get2(items):
for k in items.iterkeys():
items.get(k)
def magic3(items):
for k in items.iterkeys():
items.__getitem__(k)
def brackets1(items):
for k in items.iterkeys():
items[k]
Run Code Online (Sandbox Code Playgroud)
结果如下:
1000004 function calls in 3.779 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 3.779 3.779 <string>:1(<module>)
1 2.135 2.135 3.778 3.778 dict_get_items.py:15(get2)
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1000000 1.644 0.000 1.644 …Run Code Online (Sandbox Code Playgroud)