Wie sind Pythons Such- und Sortieralgorithmen implementiert?

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
Dingels
User
Beiträge: 61
Registriert: Dienstag 23. Dezember 2008, 19:50

Schönen guten Abend,

für eine Hausaufgabe muss ich eine Reihe von Such- und Sortieralgorithmen verwenden. Zu diesem Zweck würde ich gern wissen, wie die schon in der Standardbibliothek vorhandenen Algorithmen implementiert sind? Welche Algorithmen nutzen z.B. Sequenzoperationen wie sort(), sorted(), index(), count() etc.? Wisst ihr das oder kann man das irgendwo nachlesen? Denn es macht wenig Sinn, einen Algorithmus neu zu implementieren, wenn er tatsächlich schon längst vorhanden ist.

Könnt ihr mir da helfen? Herzlichen Dank im Voraus. :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

In der Doku zu `sorted` finde ich den Link hierzu: http://wiki.python.org/moin/HowTo/Sorting/

Und dort wiederum wird auf Timesort verwiesen. Allerdings weiß ich nicht, ob das exklusiv ist oder gar veraltet.

Ich würde mir da durchaus mal den Quellcode von CPython angucken, um zu schauen, ob da im Code Hinweise zum Algorithmus gegeben werden.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Dingels
User
Beiträge: 61
Registriert: Dienstag 23. Dezember 2008, 19:50

Danke für den Link, Hyperion. Das hilft mir schon mal weiter. Laut Wikipedia ist der Timsort-Algorithmus seit Version 2.3 Standard. Ich hab mir gerade mal den Source Code für Version 2.7 heruntergeladen, aber ich hab keine Ahnung, wo ich da jetzt anfangen soll zu suchen. :K Zumal ich auch nicht so geübt darin bin, C-Code zu lesen. Aber vielleicht weiß ja noch jemand anders Rat.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Der Sorieralgorithmus ist mit Timsort ein adaptiver Mergesort, er hat auch Einzug in OpenJDK gefunden.
`count`, `index` können nur lineare Suche anwenden, weil ueber die Daten keine Informationen verfuegbar sind, z.B. dass sie sortiert waeren.
Dingels
User
Beiträge: 61
Registriert: Dienstag 23. Dezember 2008, 19:50

Danke, cofi, interessant. Was ist außerdem mit re.findall() ?

Oder, anders gefragt: Bieten sich also genug Möglichkeiten, bessere Suchalgorithmen in Python zu implementieren, die dann hoffentlich bei großen Textmengen auch performanter sind als die aus der Standardbibliothek? In meinem speziellen Fall geht es vor allem um Suffix Arrays.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Besser ist relativ, für übliche Use Cases wirst du keinen besseren Algorithmus finden es mag aber bestimmte Fälle geben in denen andere Algorithmen besser sind.

Allerdings ist es absolut sinnlos sich damit zu befassen es sei den du hast Mesergebnisse die ein Problem aufzeigen.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Ich hatte jetzt Listen im Hinterkopf, was Strings/Texte angeht muss man ein paar Sachen unterscheiden, z.B. RE und "normale" Strings.
Was RE angeht, wird die Sache u.U. sehr komplex - je nach RE - da kenn ich mich leider zu wenig aus, aber man koennte sich mal bei Gnu grep umschaun.
Was Strings angeht gibt es Knuth-Morris-Pratt[1] und Boyer-Moore[2]

Aber DasIch hat schon recht, dass man v.a. messen muss. Interessanter wirds sogar eventuell dort, wo man Informationen ueber die Daten hat und dann Annahmen im Code machen kann. Das faellt fuer die Standardlibrary ziemlich komplett flach.

Mit suffix arrays hab ich noch nicht gearbeitet, aber ich kann mir gut vorstellen, dass man es effizienter implementieren kann aber, siehe oben, keine Relevanz fuer die Standardlibrary hat.

[1] http://en.wikipedia.org/wiki/Knuth-morris-pratt
[2] http://en.wikipedia.org/wiki/Boyer-Moore
Dingels
User
Beiträge: 61
Registriert: Dienstag 23. Dezember 2008, 19:50

Verstehe. Es geht nämlich um Folgendes: Ich studiere Computerlinguistik und in einer Vorlesung geht es derzeit um Suchalgorithmen für Strings, allen voran Suffix Trees und Suffix Arrays. Anstelle einer Klausur sollen wir uns ein Softwareprojekt ausdenken, was mit den Themen der Vorlesung zu tun hat.

Meine Idee ist es jetzt, in einem großen deutschen Textkorpus nach Komposita zu suchen und diese in ihre Bestandteile aufzutrennen (z.B. Donauschifffahrt --> Donau + Schiff + Fahrt). Das ist z.B. für maschinelle Übersetzung wichtig. Ein Ansatz dafür wäre zu untersuchen, ob einzelne Wörter als Bestandteile anderer Wörter im Korpus vorkommen, d.h. ich müsste viel Zeit mit dem Suchen von Substrings verbringen. In dem Projekt könnte ich dann z.B. auch untersuchen, ob diese Vorgehensweise mit Hilfe von Suffix Arrays effizienter gelöst werden kann oder ob es keinen Vorteil gegenüber Pythons eigenen Suchalgorithmen gibt.

Was meint ihr? Ist diese Idee es wert, untersucht zu werden? :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ja, warum nicht. Spielereien mit Datenstrukturen sind immer lohnend, selbst wenn es am schluss nicht effizienter ist, hat man immer noch was gelernt. Und darum geht es wohl auch in deriner Aufgabe.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten