Python dict.get()方法的效率
我刚刚开始学习python,我担心如果我使用dict.get(key,default_value)或者我为它定义了自己的方法……那么它们有什么区别吗: [第1种方法]:Python dict.get()方法的效率,python,methods,dictionary,get,Python,Methods,Dictionary,Get,我刚刚开始学习python,我担心如果我使用dict.get(key,default_value)或者我为它定义了自己的方法……那么它们有什么区别吗: [第1种方法]: dict={} for c in string: if c in dict: dict[c]+=1 else: dict[c]=1 python提供的另一个dict.get()方法 for c in string: dict[c]=dict.get(c,0)+1 它们在
dict={}
for c in string:
if c in dict:
dict[c]+=1
else:
dict[c]=1
python提供的另一个dict.get()方法
for c in string:
dict[c]=dict.get(c,0)+1
它们在效率或速度上是否有任何差异…或者它们只是相同的,而第二种方法只需再编写几行代码即可…对于这种特定情况,请使用或对象:
import collections
dct = collections.defaultdict(int)
for c in string:
dict[c] += 1
或
两者都是标准dict
类型的子类。计数器
类型添加了一些更有用的功能,如对两个计数器求和或列出已计数的最常见实体。defaultdict
类也可以指定其他默认类型;例如,使用defaultdict(list)
将每个键的内容收集到列表中
当您想要比较两种不同方法的性能时,您需要使用:
这表明在中使用要快一点
然而,有第三种选择要考虑;捕获键错误
异常:
>>> def tryexcept(dct, values):
... for c in values:
... try:
... dct[c] += 1
... except KeyError:
... dct[c] = 1
...
>>> timeit.timeit('test(dct, values)', 'from __main__ import values, tryexcept as test; dct={}')
18.023509979248047
这恰好是最快的,因为只有十分之一的情况下是一个新的关键
最后但并非最不重要的是,我提出了两个备选方案:
>>> def default(dct, values):
... for c in values:
... dct[c] += 1
...
>>> timeit.timeit('test(dct, values)', 'from __main__ import values, default as test; from collections import defaultdict; dct=defaultdict(int)')
15.277361154556274
>>> timeit.timeit('Counter(values)', 'from __main__ import values; from collections import Counter')
38.657804012298584
因此,Counter()
类型是最慢的,但是defaultdict
确实非常快Counter()
s虽然做了很多工作,但额外的功能可以在其他地方带来易于开发和执行速度的好处。对于这种特定情况,请使用或对象:
import collections
dct = collections.defaultdict(int)
for c in string:
dict[c] += 1
或
两者都是标准dict
类型的子类。计数器
类型添加了一些更有用的功能,如对两个计数器求和或列出已计数的最常见实体。defaultdict
类也可以指定其他默认类型;例如,使用defaultdict(list)
将每个键的内容收集到列表中
当您想要比较两种不同方法的性能时,您需要使用:
这表明在
中使用要快一点
然而,有第三种选择要考虑;捕获键错误
异常:
>>> def tryexcept(dct, values):
... for c in values:
... try:
... dct[c] += 1
... except KeyError:
... dct[c] = 1
...
>>> timeit.timeit('test(dct, values)', 'from __main__ import values, tryexcept as test; dct={}')
18.023509979248047
这恰好是最快的,因为只有十分之一的情况下是一个新的关键
最后但并非最不重要的是,我提出了两个备选方案:
>>> def default(dct, values):
... for c in values:
... dct[c] += 1
...
>>> timeit.timeit('test(dct, values)', 'from __main__ import values, default as test; from collections import defaultdict; dct=defaultdict(int)')
15.277361154556274
>>> timeit.timeit('Counter(values)', 'from __main__ import values; from collections import Counter')
38.657804012298584
因此,Counter()
类型是最慢的,但是defaultdict
确实非常快Counter()
s做了很多工作,额外的功能可以在其他地方带来易于开发和执行速度的好处。对于键计数,请使用集合。相反,Counter
对象。您也可以在此处使用集合。defaultdict(int)
。对于键计数,使用collections.Counter
对象。您也可以在此处使用collections.defaultdict(int)
。功能非常强大,这是不可能的……但同样的问题……如果它只节省很少/很多编码,或者在其他方面也更有效?如果是,那么还有哪些字段更有效?@user1977504:使用timeit
模块自己测试它。:-)非常好的功能,这是不正常的…但同样的问题…如果它只节省很少/很多编码,或者在其他方面也更有效?如果是,那么还有哪些字段更有效?@user1977504:使用timeit
模块自己测试它。:-)