len(List)的性能与读取变量


问题内容

类似的问题已经在这里询问len()函数的Cost。但是,这个问题要看len它自身的代价。假设我有一个重复多次的代码len(List),每次是O(1),读取变量也是O(1)加上分配变量is
O(1)

顺便提一下,我发现它n_files = len(Files)len(Files)我的代码中的重复代码更具可读性。因此,这已经成为我这样做的动力。您也可以反对我,认为代码中的某些地方Files可以修改,因此n_files不再正确,但事实并非如此。

我的问题是:访问之后 会更快地收到
许多呼叫吗?len(Files)``n_files


问题答案:

几个结果(一百万次呼叫的时间,以秒为单位),并在Windows 7上使用Python
2.7.10列出了十个元素;store是存储长度还是继续调用lenalias是否为len以下项创建本地别名:

Store Alias n=      1      10     100
Yes   Yes       0.862   1.379   6.669
Yes   No        0.792   1.337   6.543
No    Yes       0.914   1.924  11.616
No    No        0.879   1.987  12.617

和一千个元素的列表:

Store Alias n=      1      10     100
Yes   Yes       0.877   1.369   6.661
Yes   No        0.785   1.299   6.808
No    Yes       0.926   1.886  11.720
No    No        0.891   1.948  12.843

结论:

  • 存储结果比len重复调用(甚至是)更有效n == 1
  • 为不创建结果的本地别名len可以对较大的n地方进行较小的改进,因为我们不存储结果,但不如仅存储结果那样多。和
  • 列表长度的影响可以忽略不计,这表明是否对整数进行了intern没有任何区别。

测试脚本:

def test(n, l, store, alias):
    if alias:
        len_ = len
        len_l = len_(l)
    else:
        len_l = len(l)
    for _ in range(n):
        if store:
            _ = len_l
        elif alias:
            _ = len_(l)
        else:
            _ = len(l)

if __name__ == '__main__':
    from itertools import product
    from timeit import timeit
    setup = 'from __main__ import test, l'
    for n, l, store, alias in product(
        (1, 10, 100),
        ([None]*10,),
        (True, False),
        (True, False),
    ):
        test_case = 'test({!r}, l, {!r}, {!r})'.format(n, store, alias)
        print test_case, len(l),
        print timeit(test_case, setup=setup)