Seite 1 von 1

Was sind die wichtigsten Flaschenhälse?

Verfasst: Samstag 17. Juli 2021, 20:28
von Strawk
Hallo!
Was sind die wichtigsten Flaschenhälse in Python? Was braucht immer besonders viel Zeit? Gibt es darüber eine Art ab-/aufsteigende Liste? Mein Scrabble-Programm liefert jetzt gute Ergebnisse, braucht aber bei zwei Jokern und zwei Anlegebuchstaben 15 Minuten; das wäre einem Mitspieler für einen Zug nicht zuzumuten. Wenn Code gewünscht, kann ich gerne posten.
Grüße, Strawk

Re: Was sind die wichtigsten Flaschenhälse?

Verfasst: Samstag 17. Juli 2021, 20:46
von nezzcarth
Wenn mein eigener Code nicht so performant ist, wie ich das gerne hätte, liegt das nicht selten daran, dass der Algorithmus nicht gut oder nicht gut implementiert ist. Anhand des Codes kann man sagen, ob das bei dir auch der Fall ist. Oft helfen allgemeine Regeln wie das Kleinhalten von Schleifenkörpern oder das Vermeiden von verschachtelten Schleifen schon weiter.

Re: Was sind die wichtigsten Flaschenhälse?

Verfasst: Sonntag 18. Juli 2021, 00:21
von LukeNukem
Strawk hat geschrieben: Samstag 17. Juli 2021, 20:28 Was sind die wichtigsten Flaschenhälse in Python? Was braucht immer besonders viel Zeit? Gibt es darüber eine Art ab-/aufsteigende Liste? Mein Scrabble-Programm liefert jetzt gute Ergebnisse, braucht aber bei zwei Jokern und zwei Anlegebuchstaben 15 Minuten; das wäre einem Mitspieler für einen Zug nicht zuzumuten. Wenn Code gewünscht, kann ich gerne posten.
Das kann man nicht so pauschal sagen, fürchte ich. Geschachtelte Schleifen... äh... alles, was I/O betrifft (ja, auch Memory I/O)... "Measure, don't guess." (Kirk Pepperdine) Bitte zeig' mal Deinen Code, dann ließe sich vielleicht mehr sagen. ;-)

Re: Was sind die wichtigsten Flaschenhälse?

Verfasst: Sonntag 18. Juli 2021, 15:44
von noisefloor
Hallo,
Mein Scrabble-Programm liefert jetzt gute Ergebnisse, braucht aber bei zwei Jokern und zwei Anlegebuchstaben 15 Minuten;...
Wenn du über Rechenzeit redest solltest du schon immer noch dazu schreiben, auf welcher CPU das läuft... Ein Raspberry Pi Zero ist z.B. nun mal systembedingt drastisch langsamer als ein aktueller Core i oder Ryzen Prozessor. Und am besten auch dazu schreiben, welche Python-Implementierung du nutzt. Manchmal bringt das Ausführen durch PyPy gegenüber CPython schon viel.

Gruß, noisefloor

Re: Was sind die wichtigsten Flaschenhälse?

Verfasst: Sonntag 18. Juli 2021, 16:31
von nezzcarth
Zum Vergleich: In diesem Aufsatz wird ein Algorithmus beschrieben, der, wenn ich das richtig verstanden habe, auf einem Rechner von Ende der 70er durchschnittlich 1.4 Sekunden pro Zug brauchte. Joker/Blanks werden dabei anscheinend berücksichtigt. Vielleicht kann man da also wirklich noch etwas herausholen.

Re: Was sind die wichtigsten Flaschenhälse?

Verfasst: Donnerstag 22. Juli 2021, 06:43
von Strawk
Hallo!
Ich meine, eine Liste anstatt eines Sets zu benutzen, kann ein wichtiger Flaschenhals sein. Zu Sets habe ich eine Frage, die ich nicht googeln konnte: Was ist die 'natürliche' Reihenfolge von Set-Elementen? Wenn ich ein Set so definiere:

Code: Alles auswählen

dataScientist = set(['Python', 'R', 'SQL', 'Git', 'Tableau', 'SAS'])
erhalte ich nach

Code: Alles auswählen

print(dataScientist)
folgende Ausgabe:
{'Tableau', 'SAS', 'Python', 'SQL', 'Git', 'R'}
Auch nach wiederholter Ausgabe ist das so. Welche Reihenfolge liegt dem zugrunde? Ich weiß, dass Sets unordered sind. Aber irgendeine Reihenfolge müssen die Elemente ja haben, warum gerade diese?
Grüße, Strawk

Re: Was sind die wichtigsten Flaschenhälse?

Verfasst: Donnerstag 22. Juli 2021, 07:29
von rogerb
@Strawk.

Sets in Python kommen der mathematischen Definition einer Menge am nächsten und verhalten sich auch so.
Es ist ein Datentyp bei dem es nicht darauf ankommt in welcher Reihenfolge die Elemente darin vorhanden sind. Es geht nur darum, ob ein Element in der Menge enthalten ist oder nicht.

Die Algorithmen die Sets zugrundeliegen sind dahingehend optimiert und dementsprechend schneller.
Aber diese Implementierung von Sets kann eben von Pythonversion zu Pythonversion unterschiedlich sein, auch von Release zu Release. Daher kann man sich nicht auf eine bestimmte Reihenfolge verlassen.

Wenn Sets ihre Reihefolge garantieren würden, währen sie Listen und Tuples sehr ähnlich. Das braucht man aber nicht, da diese Funktionalität schon existiert. Daher stellen Sets eben einen eigen Datentyp zur Verfügung - mit ganz bestimmten Stärken und Schwächen.

Falls es dich interessiert, kannst du dir den C-Code von CPython anschauen und versuchen zu verstehen wie es funktioniert. (Meine C-Kenntnisse sind leider etwas rostig)
https://github.com/python/cpython/blob/ ... etobject.c

Re: Was sind die wichtigsten Flaschenhälse?

Verfasst: Donnerstag 22. Juli 2021, 08:01
von __deets__
Das war ja nicht die Frage. Sondern warum Sets offensichtlich eine stabile Reihenfolge haben.

Und der Grund ist einfach: Computer können es nicht anders. Genauso wie man ein set auch immer auf eine bestimmte Weise hinschreibt, und damit eine Reihenfolge angibt, muss der Computer bei einer Set Implementierung irgendwo anfangen, und irgendwo aufhören.

Im Fall von Python ist ein set nichts anderes als ein dict ohne werte. Und die Schlüssel wurden früher zumindest gehasht, und auf buckets verteilt. Und diese buckets, und die Schlüssel in ihnen, haben eine Reihenfolge.

Inzwischen sind die dicts in der Lage, die einfügereihenfolge beizubehalten. Ob das auch bei Sets der Fall ist, weiß ich nicht.

Re: Was sind die wichtigsten Flaschenhälse?

Verfasst: Donnerstag 22. Juli 2021, 08:47
von DeaD_EyE
Nein, sets behalten leider noch nicht die Reihenfolge. Wäre praktisch, wenn das auch für die set-operationen gelten würde.

Man kann aber mit dem dict arbeiten:

Code: Alles auswählen

values = [1,2,11,2,2,1,2,1,2]
unique_values = list(dict.fromkeys(values))
Der Nachteil ist, dass man danach kein set hat, sondern eine liste oder tuple.

Re: Was sind die wichtigsten Flaschenhälse?

Verfasst: Donnerstag 22. Juli 2021, 09:11
von rogerb
@__deets__,
Das war ja nicht die Frage. Sondern warum Sets offensichtlich eine stabile Reihenfolge haben.
Die Reihenfolge entsteht durch die zu grundeliegende Implementierung. Das hatte ich geschrieben :wink:

Was aber nicht gefragt wurde war das: :wink:
Inzwischen sind die dicts in der Lage, die einfügereihenfolge beizubehalten.
Nicht böse gemeint, aber wenn wir schon die gegenseitigen Antworten kommentieren wollen, dann richtig.