Was sind die wichtigsten Flaschenhälse?

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
Benutzeravatar
Strawk
User
Beiträge: 227
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: Aachen
Kontaktdaten:

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
Ich programmiere erfolglos, also bin ich nicht.
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

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.
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

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. ;-)
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

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.
Benutzeravatar
Strawk
User
Beiträge: 227
Registriert: Mittwoch 15. Februar 2017, 11:42
Wohnort: Aachen
Kontaktdaten:

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
Ich programmiere erfolglos, also bin ich nicht.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@__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.
Antworten