【发布时间】:2018-02-09 06:08:07
【问题描述】:
增加存储在字典中的计数器的最快方法是什么?
因为我必须执行数十万次相同的操作,所以我正在寻找比我下面的更有效的方法:
def funcA(a):
keys = [x for x in range(1, 51)]
adict = {key: 0 for key in keys}
for k in adict.keys(): # this is the code I would like to improve
if k <= a:
adict[k] += 1
else:
break
import timeit
number = 100000
t1 = timeit.timeit(
'funcA(5)',
setup="from __main__ import funcA", number=number)
print(t1)
>>> 0.42629639082588255
尝试使用列表推导似乎会减慢一切,可能是因为它缺少 break 语句?
def funcB(a):
# not working, invalid syntax
keys = [x for x in range(1, 51)]
adict = {key: 0 for key in keys}
def _inc(x):
x += 1
return x
[_inc(adict[k]) for k in adict.keys() if k <= a]
# Timing: 0.5831785711925477
注意:最初我有if float(k) <= float(a):,但由于我只期待数字(整数或浮点数),删除float() 转换改进了代码。这个假设合理吗?
注意 2:正如几个 cmets 中所述,break 语句可能会在结果字典中给出意想不到的结果,所以最好这样做:
def funcA(a):
keys = [x for x in range(1, 51)]
adict = {key: 0 for key in keys}
for k in adict:
if k <= a:
adict[k] += 1
# Timing: 0.5132114209700376
【问题讨论】:
-
您可以将
for k in adict.keys()缩短为for k in adict -
为什么不直接做:
adict = {key: 1 if key <= a else 0 for key in keys}? -
@AshwiniChaudhary 我想增加密钥
adict[k] += 1 -
另请注意
dict.keys()返回一组键,这意味着它们有时可能不会按顺序排列。因此,如果a = 20并且出现的第一个键是22,那么您将跳出循环并且什么都不会改变。 -
为什么在键是整数时使用字典?为什么不做
for k in range(1,a):而不是测试 k
标签: python performance loops dictionary counter