Python必须为
dict.get():
get
是一个属性,因此Python必须进行查询,然后将找到的描述符绑定到字典实例。()
是一个调用,因此必须将当前帧压入堆栈,必须进行调用,然后必须再次从堆栈中弹出该帧以继续。
[...]与一起使用的表示法
dict不需要单独的属性步骤或帧推入和弹出。
使用Python字节码反汇编程序
dis时,您可以看到不同之处:
>>> import dis>>> dis.dis(compile('d[key]', '', 'eval')) 10 LOAD_NAME 0 (d) 3 LOAD_NAME 1 (key) 6 BINARY_SUBSCR 7 RETURN_VALUE>>> dis.dis(compile('d.get(key)', '', 'eval')) 10 LOAD_NAME 0 (d) 3 LOAD_ATTR 1 (get) 6 LOAD_NAME 2 (key) 9 CALL_FUNCTION 1 12 RETURN_VALUE因此
d[key]表达式只需要执行一个
BINARY_SUBSCR操作码,而
d.get(key)添加一个
LOAD_ATTR操作码。
CALL_FUNCTION它比
BINARY_SUBSCR内置类型要昂贵得多(带有
__getitem__方法的自定义类型仍然要进行函数调用)。
如果您的 大多数 键都存在于字典中,则可以使用它
try...except KeyError来处理丢失的键:
try: return mydict['name']except KeyError: return None
如果没有异常,则异常处理很便宜。


![为什么dict.get(key)的运行速度比dict [key]慢 为什么dict.get(key)的运行速度比dict [key]慢](http://www.mshxw.com/aiimages/31/652918.png)
