此处已经提出类似的问题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
会更快吗?
答案 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
,但在前一种情况下,您必须同时查找len
和Files
,然后在该调用之上查找“计算”长度的函数Files
。