快速提问主要是为了满足我对这个话题的好奇心.
我正在编写一些带有SQlite数据库后端的大型python程序,将来会处理大量的记录,所以我需要尽可能地进行优化.
对于一些函数,我在字典中搜索键.我一直在使用"in"关键字进行原型设计,并计划稍后返回并优化这些搜索,因为我知道"in"关键字通常是O(n)(因为这只是转换为python迭代整个列表并进行比较每个元素).但是,由于python dict基本上只是一个哈希映射,python解释器是否足够智能解释:
if(key in dict.keys()):
...code...
Run Code Online (Sandbox Code Playgroud)
至:
if(dict[key] != None):
...code...
Run Code Online (Sandbox Code Playgroud)
它基本上是相同的操作,但顶部是O(n),底部是O(1).
我很容易在我的代码中使用底部版本,但后来我只是好奇并且想我会问.
我对这个问题有一个后续问题.原始问题的一位评论者提到他过去曾经误认为人们使用如下语法:
key in d.keys()
Run Code Online (Sandbox Code Playgroud)
在O(n)时间内完成,而不是
key in d
Run Code Online (Sandbox Code Playgroud)
在O(1)时间内完成,没有意识到差异.直到今天(当我在试图理解为什么我的代码运行如此缓慢之后偶然发现原始问题时),我才是其中之一.我尝试使用Python 2.7.5验证注释的准确性,果然,这里是timeit的结果:
$ python -m timeit -s 'd=dict.fromkeys(range(100))' '1000 in d.keys()'
100000 loops, best of 3: 2.18 usec per loop
$ python -m timeit -s 'd=dict.fromkeys(range(100))' '1000 in d'
10000000 loops, best of 3: 0.0449 usec per loop
$ python -m timeit -s 'd=dict.fromkeys(range(1000))' '10000 in d.keys()'
100000 loops, best of 3: 17.9 usec per loop
$ python -m timeit -s 'd=dict.fromkeys(range(1000))' '10000 in d'
10000000 loops, best of 3: …Run Code Online (Sandbox Code Playgroud)