Python3的速度更快? len或字典查找?

时间:2014-11-09 22:32:12

标签: python performance dictionary

什么更快(Python3)?

if len(interval) <= 2:
  return 1

或:

if interval in intervaldict:
  return intervaldict[interval]

取决于字符串的长度还是字典的长度?我做了一些简单的测试,看起来len更贵,这对我来说似乎违反直觉。

2 个答案:

答案 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
>>>

此外,根据字典的长度,这些统计信息不会发生变化,因为lenin都有字典的O(1)(常量)复杂性。

答案 1 :(得分:5)

请参阅Python's Time Complexity

列表中的

len在所有情况下都是 O(1),而在字典中查找分摊最坏情况O(n)。复杂性和运行时不同。对于某些情况,字典查找将花费更长时间,但它可能很少发生,并且仅对于如此大的字典而言,它将不是最适合您的用途。