[PYTHON] Je ne veux pas de document if lors du traitement après confirmation de l'existence de la clé dict

2017.3.13 update

-Vérification supplémentaire du traitement commenté par @shiracamus et @tenmyo

si document

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

Essayez de mesurer la vitesse

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]

~~ Cela ne change pas grand-chose ~~ 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.

ifOui .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!

Point Moyari

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

Je ne veux pas de document if lors du traitement après confirmation de l'existence de la clé dict
Je ne veux pas l'admettre ... Représentation dynamique du système de Neural Network
Remarque Python: lorsque vous souhaitez connaître les attributs d'un objet
Traitement lorsque l'entrée clé de pygame Python ne se passe pas bien.
Je souhaite laisser une commande arbitraire dans l'historique des commandes de Shell
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
Je souhaite stocker les résultats de% time, %% time, etc. dans un objet (variable)
J'ai vérifié la vitesse de traitement de la numpy unidimensionnelle
Je souhaite personnaliser l'apparence de zabbix
Je souhaite être informé de l'environnement de connexion lorsque RaspberryPi se connecte au réseau