什么更快(Python3)?
if len(interval) <= 2:
return 1
或:
if interval in intervaldict:
return intervaldict[interval]
取决于字符串的长度还是字典的长度?我做了一些简单的测试,看起来len
更贵,这对我来说似乎违反直觉。
答案 0 :(得分:5)
len
解决方案稍微慢了,因为涉及的内容更多。您可以通过使用dis.dis
>>> import dis
>>> dct = {1:1, 2:2}
>>> dis.dis('1 in dct')
1 0 LOAD_CONST 0 (1)
3 LOAD_NAME 0 (dct)
6 COMPARE_OP 6 (in)
9 RETURN_VALUE
>>> dis.dis('len(dct) <= 2')
1 0 LOAD_NAME 0 (len)
3 LOAD_NAME 1 (dct)
6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
9 LOAD_CONST 0 (2)
12 COMPARE_OP 1 (<=)
15 RETURN_VALUE
>>>
请注意,len
解决方案具有len
的额外名称查找以及函数调用。这些都需要时间。但是,正如您从下面的timeit.timeit
测试中看到的那样,性能差异非常微不足道:
>>> import timeit
>>> dct = {1:1, 2:2}
>>> timeit.timeit('1 in dct', 'from __main__ import dct')
0.24376701508152573
>>> timeit.timeit('len(dct) <= 2', 'from __main__ import dct')
0.4435952055358978
>>>
此外,根据字典的长度,这些统计信息不会发生变化,因为len
和in
都有字典的O(1)
(常量)复杂性。
答案 1 :(得分:5)
len
在所有情况下都是 O(1),而在字典中查找分摊最坏情况O(n)。复杂性和运行时不同。对于某些情况,字典查找将花费更长时间,但它可能很少发生,并且仅对于如此大的字典而言,它将不是最适合您的用途。