你的两个例子做同样的事情,但并不意味着get
与setdefault
做。
两者之间的区别基本上是手动设置d[key]
为每次指向列表,而不是仅在未设置时才setdefault
自动设置d[key]
为列表。
我使这两种方法尽可能相似
from timeit import timeit
print timeit("c = d.get(0, []); c.extend([1]); d[0] = c", "d = {1: []}", number = 1000000)
print timeit("c = d.get(1, []); c.extend([1]); d[0] = c", "d = {1: []}", number = 1000000)
print timeit("d.setdefault(0, []).extend([1])", "d = {1: []}", number = 1000000)
print timeit("d.setdefault(1, []).extend([1])", "d = {1: []}", number = 1000000)
并得到
0.794723378711
0.811882272256
0.724429205999
0.722129751973
因此setdefault
比get
为此目的快10%。
该get
方法可以使您做的事 少于 使用setdefault
。KeyError
即使您不想设置密钥,也可以使用它来避免在密钥不存在时得到提示(如果那会经常发生)。
请参阅“ setdefault”的dict方法的用例,并且dict.get()方法返回一个指针,以获取有关这两种方法的更多信息。
关于主题的setdefault
结论是,大多数情况下,您想使用defaultdict
。关于该线程的get
结论是它很慢,通常最好(在速度方面)使用defaultdict或处理错误(取决于字典的大小和您的用例)进行双重查找。