Array oder Datenbank?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
andi24
User
Beiträge: 56
Registriert: Freitag 5. März 2010, 11:42

Hallo zusammen,

ich habe einen Pool aus 3.000 verschiedenen Zahlenwerten (in einer Textdatei) und möchte von einer bestimmten Zahl wissen, ob sie in diesem Pool vorkommt.

Mir fallen jetzt zwei verschiedene Vorgehensweisen ein:

1) Ich lese die 3.000 Werte in eine Datenbank ein und suche dann einfach per SQL-Abfrage ob mein gesuchter Wert darin enthalten ist

2) Ich speichere die 3.000 Werte in einem Array/Liste und prüfe per liste.find ob mein Wert drin ist

Was würdet ihr mir raten? Aus dem Bauch heraus würde ich vermuten, dass die DB-Geschichte mehr kostet (alleine schon das Einlesen...). Aber kann ich andererseits überhaupt 3.000 Werte in einer Liste speichern?

Vielen Dank für euere Antworten,

Andi
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

3000 Werte sind im Normalfall lächerlich wenig. Packe es einfach in eine Liste. Wenn du die Abfrage oft durchführen musst, dann wandle die Liste in eine Menge um.

Statt "find" solltest du auch besser "in" benutzen.

Sebastian
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wieso hast Du es nicht ausprobiert?

Code: Alles auswählen

In [6]: l = range(10000)

In [7]: l[999999]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)

C:\Dokumente und Einstellungen\MECL User 1\Eigene Dateien\<ipython console> in <
module>()

IndexError: list index out of range

In [8]: l[99]
Out[8]: 99
Das ganze passiert extrem schnell. Im schlechtesten Fall ist der Zugriff eben O(n), bei n Einträgen. Ich weiß allerdings nicht, ob CPython da intern Verkettete Listen nutzt, oder direkten Index-Zugriff bietet. Aber Da Du ja nur 3000 Einträge hast, spielt das wohl nicht die große Rolle.

Ich denke, dass relationale Datenbanken da keinen Vorteil bringen.

Evtl. wäre ein Set aber das richtige für Dich. Da die Wert dort def. gehasht werden, sollte der Zugriff dort in O(1) funzen!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Listen werden als Arrays implementiert, Indexzugriff kostet O(1) eine Suche allerdings O(n) im Gegensatz zu O(1) bei einem set.
Antworten