MyDict = {'key1':'value1', 'key2':'value2'}
我可以通过以下几种方式做到这一点:
if 'key1' in MyDict:
var1 = MyDict['key1']
或
if MyDict.has_key('key1'):
var1 = MyDict['key1']
或 <击> 撞击>
<击>if MyDict['key1']:
var1=MyDict['key1']
击> <击> 撞击> 或
try:
var1=MyDict['key1]
except KeyError, e:
pass
或者我尝试了类似这样的东西,但它在python
中不起作用if v=MyDict.get('key1'):
var1=v
我们感冒可能会找到更多有效的方法。 哪一个在计算速度方面最有效?
答案 0 :(得分:30)
给你一点基准(ipython):
In [1]: def test_1(d, k):
...: if k in d:
...: var1 = d[k]
...:
In [2]: def test_2(d, k):
...: if d.has_key(k):
...: var1 = d[k]
...:
In [3]: def test_3(d, k):
...: try:
...: var1 = d[k]
...: except KeyError as e:
...: pass
...:
In [4]: def test_4(d, k):
...: if d.get(k):
...: var1 = d[k]
...:
In [5]: my_dict = {'key{}'.format(i): 'value{}'.format(i) for i in range(1000)}
In [6]: key_valid = "key5"
In [7]: key_non_valid = "key"
In [8]: %timeit test_1(my_dict, key_valid)
10000000 loops, best of 3: 172 ns per loop
In [9]: %timeit test_1(my_dict, key_non_valid)
10000000 loops, best of 3: 132 ns per loop
In [10]: %timeit test_2(my_dict, key_valid)
1000000 loops, best of 3: 211 ns per loop
In [11]: %timeit test_2(my_dict, key_non_valid)
10000000 loops, best of 3: 171 ns per loop
In [12]: %timeit test_3(my_dict, key_valid)
10000000 loops, best of 3: 151 ns per loop
In [13]: %timeit test_3(my_dict, key_non_valid)
1000000 loops, best of 3: 1.07 µs per loop
In [14]: %timeit test_4(my_dict, key_valid)
1000000 loops, best of 3: 246 ns per loop
In [15]: %timeit test_4(my_dict, key_non_valid)
10000000 loops, best of 3: 189 ns per loop
结论:构造key in dict
通常最快,在有效密钥的情况下仅优于try except
,因为它不执行if
操作。
答案 1 :(得分:2)
假设您不仅在设置var1
时才要定义MyDict["key1"]
,显而易见的解决方案是var1 = MyDict.get("key1", default=some_sentinel_or_default_value)
。
wrt /表演,主要取决于你是否期望&#34; key1&#34;大部分时间都在你的词典中。如果第一个,try / except块可能更快,否则它会更慢(尝试/除了块设置便宜但是当有实际例外时代价很高)。
如果您真的非常担心性能问题,我建议您使用timeit
模块测试在实际数据上的各种选项。
答案 2 :(得分:0)