相关疑难解决方法(0)

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

在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()更快.为什么?

python python-internals

18
推荐指数
1
解决办法
2567
查看次数

为什么__getitem __(键)和get(键)明显慢于[key]?

据我所知,括号只不过是一个包装器__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)

python benchmarking profiling

12
推荐指数
1
解决办法
3198
查看次数