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
是存储长度还是继续调用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
地方进行较小的改进,因为我们不存储结果,但不如仅存储结果那样多。和 - 列表长度的影响可以忽略不计,这表明是否对整数进行了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)