[PYTHON] Ich möchte kein if-Dokument bei der Verarbeitung, nachdem das Vorhandensein des Diktatschlüssels bestätigt wurde

2017.3.13 update

wenn Dokument

So was

if key not in test_dict:
    test_dict[key] = 0
test_dict[key] += 1

Ich möchte so schreiben

test_dict[key] = test_dict.get(key, 0) + count

Versuchen Sie, die Geschwindigkeit zu messen

Ich habe Angst, wenn es spät ist

# 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]

~~ Es ändert sich nicht viel ~~ defaultdict scheint schnell zu sein!

~~ Ich habe es irgendwie versucht, aber es scheint, dass es keinen großen Unterschied gibt. Ich werde in der kürzeren schreiben und leben. ~~

Die von @shiracamus kommentierte Messung mit defaultdict scheint schnell zu sein. Ich habe es dreimal versucht und das gleiche Ergebnis erzielt.

ifJa .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

Verwenden wir das nächste Mal defaultdict!

Moyari Punkt

Es scheint, dass das, was man unter bestimmten Umständen viel schneller ist. Es scheint sich je nach Trefferquote zu ändern. Es scheint verschiedene Muster zu geben ...

Wenn jemand weiß, lassen Sie es mich bitte wissen

Warum ist "Counter" langsam? Ich frage mich, ob die Verwendung anders ist.

Recommended Posts

Ich möchte kein if-Dokument bei der Verarbeitung, nachdem das Vorhandensein des Diktatschlüssels bestätigt wurde
Ich möchte es nicht zugeben ... Die dynamische Systemdarstellung von Neural Network
Python Hinweis: Wenn Sie die Attribute eines Objekts kennen möchten
Verarbeitung, wenn die Schlüsseleingabe von Python-Pygame nicht gut funktioniert.
Ich möchte einen beliebigen Befehl im Befehlsverlauf von Shell belassen
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ich möchte die Ergebnisse von% time, %% time usw. in einem Objekt (Variable) speichern.
Ich habe die Verarbeitungsgeschwindigkeit der numpy eindimensionalisierung überprüft
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich möchte über die Verbindungsumgebung benachrichtigt werden, wenn RaspberryPi eine Verbindung zum Netzwerk herstellt