2016-06-14 5 views
-2

Ich habe ein Wörterbuch, das als ein Zähler für verschiedene Schlüssel fungiert, d. H. Der Wert eines Schlüssels ist die Anzahl, wie oft ein Schlüssel aufgetreten ist. Ist es schneller für mich, ein string-indiziertes Wörterbuch oder ein ganzzahlig indexiertes Wörterbuch zu verwenden? Welche hat eine bessere Leistung?String-Indizes oder Integer-Indizes für Dictionaries in Python?

+4

Haben Sie über _Messungen_ nachgedacht? –

+3

Wie viele Daten erwarten Sie? Wird Leistung hier wirklich eine Rolle spielen? Mein Instinkt wäre, mit dem zu gehen, was am einfachsten zu programmieren ist. – Matthew

Antwort

2
# coding=utf-8 

import sys 
import timeit 

print(sys.getsizeof(1000000000)) 
28 

print(sys.getsizeof('aaaaaaa')) 
56 

print(timeit.timeit('{1:1}', number=10 ** 7)) 
0.935662218856579 

print(timeit.timeit('{"1":1}', number=10 ** 7)) 
0.8795463330796326 

print(timeit.timeit(stmt='a[1]', setup='a = {1:1}', number=10 ** 7)) 
0.24523148719450227 

print(timeit.timeit(stmt='a["1"]',setup='a = {"1":1}', number=10 ** 7)) 
0.22414418170794992 

print(timeit.timeit('{x*x:x for x in range(1000)}', number=1000)) 
0.10348407957872885 

print(timeit.timeit('{"a"*x:x for x in range(1000)}', number=1000)) 
0.5330044677382393 

Ints verwenden weniger Speicher, aber Strings sind ein klein wenig schneller, wenn es um die Zuweisung und aus einem Wörterbuch zugreifen .... Wenn wir ein Wörterbuch mit Streichern füllen, in diesem Fall Ints schneller sind.

Gehen Sie mit, was Ricardo gesagt hat. Ich bezweifle, dass es einen signifikanten Unterschied gibt.

Wenn Sie schnell wollen, verwenden Sie PyPy.

+0

Interessant. Liegt es daran, dass die Funktion 'hash()' von python mit Strings schneller ist? –

+0

Ich halte diesen Test für etwas unfair, da Sie Strings nur mit einer Zeichenlänge verwenden, während Sie für Integer eine volle 64-Bit-Darstellung haben. Und in Bezug auf das Problem, das von OP gepostet wird, bezweifle ich, dass die Strings auf dem Längenbereich von einem Zeichen liegen werden. –

+0

Die Größe der Zeichenfolge wird für jedes hinzugefügte zusätzliche Zeichen um 1 erhöht, sodass Sie für praktische Zwecke entweder für viele, viele Schlüssel verwenden können. Das int ist normalerweise immer kleiner. Warum ist es schneller? Ich bin mir nicht sicher. Ints sind ihre eigenen Hash-Codes, also glaube ich nicht, dass es sich auf 'hash()' bezieht, aber ich kann es wirklich nicht sagen. –

1

Ihre Antwort ist: es macht "fast" keinen Unterschied.

F: Warum fast?

A: Strings können, je nach ihrer Größe, zeitaufwendiger sein als Integer, da der Interpreter den String einer Zahl zuordnen muss, während die Integer-Zahl selbst bereits eine Zahl ist. Es kann jedoch abhängig von der Größe der Zeichenfolge variieren.

Aber es wird fast keinen Unterschied für Ihren Fall machen. Wie die Ergebnisse in der Antwort von Basili Syrakis gezeigt haben.

Was Sie verstehen müssen, ist, dass Wörterbücher auf Hash-Tabellen basieren, daher wird es asymptotisch O (1) kosten, einen Wert für einen angegebenen Schlüssel zurückzugeben. Dann sollte der Typ kein großer Unterschied für Ihren Fall sein.

+0

gab Ihnen eine Stimme für eine praktische Schlussfolgerung –