2017.3.13 update
-Vérification supplémentaire du traitement commenté par @shiracamus et @tenmyo
Comme ça
if key not in test_dict:
test_dict[key] = 0
test_dict[key] += 1
Je veux écrire comme ça
test_dict[key] = test_dict.get(key, 0) + count
J'ai peur s'il est tard
# coding=utf-8
import random
import time
import collections
S = "abcdefghijklmnopqrstuvwxyz01234567890"
sum_map = dict()
def get_rand_key():
return "".join([random.choice(S) for i in range(3)])
def test01(max=10000):
count = 0
test_dict = dict()
while count <= max:
count += 1
key = get_rand_key()
if key not in test_dict:
test_dict[key] = 0
test_dict[key] += count
def test02(max=10000):
count = 0
test_dict = dict()
while count <= max:
count += 1
key = get_rand_key()
test_dict[key] = test_dict.get(key, 0) + count
def test03(max=10000):
count = 0
test_dict = collections.defaultdict(int)
while count <= max:
count += 1
key = get_rand_key()
test_dict[key] += count
def test04(max=10000):
count = 0
test_dict = collections.Counter()
while count <= max:
count += 1
key = get_rand_key()
test_dict[key] += count
def check(method, num, loop_num):
name = method.__name__
start_ts = time.time()
method(max=num)
diff = time.time() - start_ts
sum_map[name] = sum_map.get(name, 0) + diff
print "[{}] {} {}sec".format(loop_num, name, diff)
for i in range(20):
num = 1000000
check(test01, num, i)
check(test02, num, i)
check(test03, num, i)
check(test04, num, i)
for key in sorted(sum_map.keys()):
print key, sum_map[key]
defaultdict
semble être rapide!~~ Je l'ai essayé d'une manière ou d'une autre, mais il semble qu'il n'y ait pas beaucoup de différence. J'écrirai dans le plus court et vivrai. ~~
La mesure avec defaultdict
commentée par @shiracamus semble être rapide.
Je l'ai essayé trois fois et j'ai obtenu le même résultat.
if Oui |
.get |
defaultdict |
Counter |
---|---|---|---|
50.5 | 52.6 | 49.3 | 55.4 |
53.0 | 53.8 | 50.2 | 56.6 |
53.5 | 53.7 | 49.9 | 54.7 |
Utilisons defaultdict
la prochaine fois!
Il semble que celui-ci soit beaucoup plus rapide dans certaines circonstances spécifiques. Cela semble changer en fonction du taux de réussite. Il semble y avoir différents modèles ...
Si quelqu'un sait, merci de me le faire savoir
Pourquoi «Counter» est-il lent? Je me demande si l'utilisation est différente.
Recommended Posts