Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python dict.get()方法的效率_Python_Methods_Dictionary_Get - Fatal编程技术网

Python dict.get()方法的效率

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 它们在

我刚刚开始学习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

它们在效率或速度上是否有任何差异…或者它们只是相同的,而第二种方法只需再编写几行代码即可…

对于这种特定情况,请使用或对象:

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
模块自己测试它。:-)