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

时间:2015-07-22 10:02:04

标签: python performance

此处已经提出类似的问题Cost of len() function。但是,这个问题着眼于len自我的成本。 假设,我有一个重复多次len(List)的代码,每次都是O(1),读取变量也是O(1)加上分配它也是O(1)

作为旁注,我发现n_files = len(Files)比我的代码中重复len(Files)更具可读性。所以,这对我来说已经是一种激励。 您也可以反对我,可以修改代码Files中的某个位置,因此n_files不再正确,但事实并非如此。

我的问题是:
访问len(Files)后是否有多次调用n_files 会更快吗?

4 个答案:

答案 0 :(得分:7)

一些结果(时间,以秒为单位,一百万次调用),在Windows 7上使用Python 2.7.10的十元素列表; store是我们存储长度还是保持呼叫len,而alias是我们是否为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进行小幅改进,我们不存储结果,但不能只存储结果;和
  • 列表长度的影响可以忽略不计,这表明整数是否被实习并没有任何区别。

测试脚本:

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)

答案 1 :(得分:1)

python中的函数调用成本很高,因此如果您在从变量访问其长度时100%确定n_files的大小不会改变,则可以使用该变量,如果这是对你来说也更具可读性。

访问len(list)和从变量访问的示例性能测试都给出了以下结果 -

In [36]: l = list(range(100000))

In [37]: n_l = len(l)

In [40]: %timeit newn = len(l)
10000000 loops, best of 3: 92.8 ns per loop

In [41]: %timeit new_n = n_l
10000000 loops, best of 3: 33.1 ns per loop

访问变量总是比使用len()更快。

答案 2 :(得分:0)

使用python -m timeit -s "li = [1, 2, 3]" "len(li)" 1000000 loops, best of 3: 0.239 usec per loop python -m timeit -s "li = [1, 2, 3]; l = len(li)" "l" 10000000 loops, best of 3: 0.0949 usec per loop 的速度更快:

.find('myForm')

答案 3 :(得分:0)

使用len(Files)代替n_files可能会更慢。是的,您必须查找n_files,但在前一种情况下,您必须同时查找lenFiles,然后在该调用之上查找“计算”长度的函数Files