Transcript: Python 3.13
Full episode transcript. Timestamps refer to the audio playback.
Ja, hallo liebe Hörerinnen und Hörer, willkommen beim Python-Podcast. Heute Jubiläumsepisode 60.
Hi Jochen.
Jubiläum. Herzlichen Glückwunsch und auch herzlich willkommen Dominik.
Ja, und auch, genau, ja beziehungsweise.
Lieber Johannes, dich kennt man zwar.
Ja, genau.
Hallo zusammen und herzlichen Glückwunsch zur 60. Episode.
Danke. Und lieber TF, auch dir.
Ja, vielen Dank, hallo.
Du warst ja auch schon mal da, habe ich noch in Erinnerung.
Genau, Januar 23 haben wir gerade rekonstruiert.
Ja, wir sprechen heute über Python 3.13. Und ich würde sagen, dann legen wir auch direkt los.
Ja, wollen wir noch News machen oder nicht?
Ich wollte gerade sagen, mit den News.
Genau, das ist natürlich irgendwie schon ein bisschen her. Wir sind ein bisschen spät dran. Aber es ist vielleicht auch noch interessant. Es gibt ein paar schöne Sachen, die man darüber erzählen kann, oder?
Ja, also wollen wir direkt
Python 3.13, können wir auch direkt
Es war gar nicht so viel los, oder?
Nee, sonst war auch nicht so viel los, stimmt
Also ja, erzähl uns was
Ich hab's jetzt auch schon überall
irgendwie installiert, wo ich irgendwie
Projekte angefasst habe und es funktioniert super
und
genau, ja, jetzt
haben wir da so einige Dinge
Vielleicht fangen wir einfach tatsächlich mit der
neuen REPL an
irgendwie, die halt aus
einem PyPy-Projekt
übernommen wurde.
Mit der neuen REPL.
Was ist eine REPL?
Ja, so eine Read-Eval-Print-Loop.
Irgendwie das, was man bekommt, wenn man
einfach nur Python eingibt und unterdrückt.
Also nutzt ihr schon 3.13? Alle?
Außer Jochen?
Ich nutze es nicht, ich nutze aber die neue REPL.
Ah.
Das ist natürlich ein Spass.
Ja gut, ich benutze IPython überall.
Warum nicht Bipython?
Das hatten wir vorhin im Vorgespräch schon mal kurz besprochen.
Also ich fand die Begründung interessant,
warum sie eigentlich überhaupt die REPL verbessern,
wenn sie sowieso ja wissen, dass die meisten Leute
halt sich sowieso als erstes erstmal IPython installieren,
weil das halt einfach viel, viel netter ist.
Aber der Grund scheint zu sein, dass die CPython Core Devs
halt während sie quasi dann die nächste Version entwickeln,
erstmal geht PyPI nicht und PIP nicht
und IPython geht vielleicht auch nicht auf der neuen Version
und damit sie es quasi beim Entwickeln etwas netter haben,
haben sie sich quasi den schöneren Multiline Edit,
schönere History, Farben, Rappel implementiert,
der jetzt in 3.13 released.
Also ich finde es auch toll, weil ich bin ja zu v4ipycen
und ich mache das eigentlich sonst immer klassisch und toll.
Endlich.
Die Welt.
Bunt.
Die Welt verbessert durch Eigennutzer, also Sauerei.
Ja, also das mit den Farben finde ich relativ abgefahren tatsächlich.
Also ich habe jetzt seit, weiß nicht, Oktober
jetzt auch den farbigen Rappel.
und wenn ich dann aber eine alte Version benutze
und es ist dann plötzlich nur noch schwarz-weiß
und es ist ja gar nicht so viel Farbe,
es sind ja wirklich nur die größer als Zeichen,
aber das kommt einem dann fast schon altbacken vor.
Ja, Back to the Future,
das ist schon ein bisschen wie damals.
Aber schade, dass es nicht früher noch grün war oder so,
aber ein echter Hacker.
Ja, die Farbauswahl,
die die C-Python-Entwickler getroffen haben,
das war ein riesen Diskussionsthema.
Das ist halt so Bike-Shedding-mäßig.
Also da kann man halt gut drüber diskutieren.
Und das Problem ist,
dass man halt aus der Shell raus nicht rausfinden kann,
ob die Shell auf schwarz auf weiß oder weiß auf schwarz eingestellt ist.
Das heißt, man muss Farben wählen, die bei beiden Hintergrundfarben
quasi noch einen einigermaßen brauchbaren Kontrast dann ergeben.
Und deswegen ist dieses, was ist das?
Dieses Pink und Rot sind so ein bisschen so ein Kompromiss,
weil das halt sowohl auf dem schwarzen Hintergrund
als auch auf dem weißen Hintergrund noch einigermaßen gut lesbar bleibt.
Ach okay, interessant.
Ja, aber
genau,
wie kommt das denn, dass du
die Rapple schon verwendet hast,
obwohl gar nicht...
Ja, also die Rapple ist,
das ist quasi die PyPy-Rapple,
nicht ganz, also die haben total viele neue Features
eingebaut und Bugs gefixt und so, aber so
dieses Kernfeature, dass es eben
Multiline-Edit
gibt, also
vielleicht können wir auch kurz sagen, was das ist, also
wenn man quasi auf der Python-Channel
eine Funktion angibt, die halt über mehrere Zeilen geht
und man macht dann irgendwie so einen Tippfehler in Zeile
2 von 8,
dann musste man bisher halt quasi dann mit der
History Zeile für Zeile in der richtigen Reihenfolge
dann die Funktion
wieder so neu zusammensetzen, die entsprechende
kaputte Zeile dann reparieren und dann die anderen
wieder über die History holen und das
ist halt total nervig. Und deswegen gibt es
jetzt eben
Multiline Edit und PyPi hatte das, wie ich gerade schon gesagt habe,
schon quasi schon immer, also in Anführungszeichen
also seit PyPi
2.4 oder 2.5 oder so hatten wir das,
dass man halt quasi, wenn man nach einer
Funktion Pfeil nach oben drückt, dann kriegt man
halt die ganze Funktion über mehrere Zeilen. Man kann dann auch
wie in einem Editor mit Pfeil nach oben dann in die fr Zeilen der Funktion kann das einfach editieren geht dann wieder ans Ende und mit Enter definiert man die Funktion neu Und das hat ja halt sagen wir mal zwei der fr
Piper-Entwickler einfach so als
in Anführungszeichen normalen Python-Code geschrieben.
Das war einfach, also das hat eigentlich
keine Piper-spezifischen Features
irgendwie gebraucht.
Michael Hudson, Doyle und Armin Rigo waren das.
Und
so ungefähr von einem Jahr haben halt
zwei der C-Python-Entwickler,
Luca Schlanger und
Galindo Salgado gesagt, dass sie das auch gern für
CPython hätten, beziehungsweise die haben halt versucht
sich zu überlegen, wie sie den
REPL verbessern können. Der REPL war bisher in
CPython NC geschrieben und das macht halt
alle Verbesserungen daran relativ nervig und aufwendig.
Und dann haben sie halt geguckt, woher man
vielleicht Python-Code nehmen könnte,
der irgendwie einen Teil des Problems schon löst,
ohne dann alles nochmal neu machen zu müssen und dann
habe ich halt gesagt, dass
sie vielleicht sich mal anschauen könnten, was Piper da hat und
dann haben sie das eben übernommen, angepasst,
den Code auch total verbessert, weil
in PyPy ist der auch immer noch
Python 2 kompatibel, weil wir auch immer noch
Python 2 Versionen releasen
und also das
haben die quasi so ein bisschen Grund überholt
und neue Tests geschrieben und so.
Und eben auch einiges an neuen Featuren hinzugefügt, also
ich hab ein paar Notizen
dazu gemacht. Also einmal die Farben, die haben wir nicht
gehabt, dann
diesen Paste Mode, den es jetzt gibt,
also wenn man quasi aus der Zwischenablage
irgendwie mehrere Zeilen Code einfügt, dann geht ja oft
die Einhöhung kaputt und das
ist jetzt eben auch repariert.
Auch Support für Windows
hatten wir bisher auch nicht und halt die Farben.
Was ich tatsächlich
auch nicht kannte, war, dass man einfach so ein Skript
reinfügen kann. Ich habe gehört, dass das schon ein bisschen
älter ist. Ich weiß aber nicht, bei welcher Version das reingekommen ist.
Man kann eine Environment-Variable setzen
und dann wird ein Skript rausgefügt.
Das heißt, du hast deine Imports, die du immer machst,
direkt mit dabei, wenn du zum Beispiel
diese setzt.
Deine Lieblingsmodule.
Nur sieben?
Finde ich ziemlich cool. Man kann dann lustige Sachen machen.
Python-Starter heißt das.
Ja.
Sehr schön. Muss ich unbedingt
für mein System auch bauen.
Ja, aber genau.
Ein großer Vorteil ist glaube ich
auch jetzt, dass es vorher
direkt in C, glaube ich,
geschrieben ist. Und jetzt ist es halt auch
Pure Python sozusagen. Und ich glaube,
da kann man jetzt auch einfach eine ganze Menge mehr
an die Innereien rankommen und dann auch das Verhalten
so ändern, dass man da eine ganze Menge
lustige Dinge mit tun kann.
Lukas Schlager hatte da auf der
EuroPython auch einen Vortrag gehalten,
wie man Live-Coding...
Wie man eine Performance performt.
Live-Musik-Coding-Geschichten
und da ist es natürlich praktisch, wenn man halt...
Lustig war, dass der Tontechniker,
der hat einen Eurorack dabei gehabt und hat irgendwie so einen hohen Ton
auf seinem Synthesizer gespielt,
dass der Tontechniker kurz Angst bekommt, dass seine Anlage
Schrott geht, hat alles runtergedreht auf so
20% Lautstärke oder sowas
und auf einmal war es sehr leise.
Und dann hat er
fünf Minuten so gespielt und irgendwann hat jemand geklopft
vom Tuchenechniker und hat dann überredet und gesagt, ja,
Lukas, wird diese hohen Frequenzen jetzt nicht
mehr spielen? Und dann durfte er wieder lauter drehen.
Ja, ich glaube,
das sieht man auch jetzt schon so ein bisschen. Es gibt halt einfach viel mehr
Bug Reports und Patches, was den neuen Rappel angeht.
Es ist immer noch so, dass es schon so ein bisschen
nervig ist, daran zu arbeiten, weil
wenn der Rappel kaputt ist, dann sieht man halt auch gleich nichts mehr.
Also der Debugger geht nicht.
Und also es ist schon,
die haben da schon so ein bisschen
eigene debugging-Sachen eingebaut.
Aber es ist schon noch so,
es bleibt so ein bisschen frickelig. Aber ich glaube, man kann
auch die alte wieder aktivieren irgendwie.
Insofern hat man
da vielleicht dann die Möglichkeit, auch mit der Umgebungsvariable
wieder auf die alten Dings zu kommen. Aber ja,
klar, ist natürlich, wenn man es kaputt macht, dann
ein Problem.
Ah ja, wichtiges anderes Neufeature
ist natürlich, dass man jetzt bei Exit keine Klammern
mehr braucht. Oh ja. Ja, und ich glaube,
Quid geht auch. Ja, vielleicht ist das so.
Ich meine, ja.
Ja, und Help gibt auch
irgendwie jetzt anders,
aber ehrlich gesagt, keine Ahnung.
Es gibt jetzt diesen Help-Mode, der eingebaut ist mit
F1 und dann kann man quasi aus dem
aus der Shell in so eine spezielle
Help-Shell wechseln und von da dann,
wenn man quasi die Namen von
irgendwelchen Sachen, die man dokumentiert haben möchte,
eingibt, dann kriegt man die direkt angezeigt.
Aber bei Print braucht man schon noch Klammern,
oder?
Nee.
Ich möchte jetzt einfach
Python 2 wieder haben.
Vielleicht das mal als
Feature-Request vorschlagen. Also das kannst du jetzt auf jeden Fall
für deine Rappel-Katze
das einbauen, dass sie sich dann wieder gegen Python 2
Das kann ich das machen.
Das mit dem Exit ist tatsächlich was, was
halt Newbies sich relativ oft wünschen.
Also weil man dann
Q reicht, glaube ich, auch.
Was ist das so?
Q reicht? Nee.
Warum steht denn das da?
Weiß ich nicht. Ach, für den Head-Mode.
Also Crit geht, aber
Q nicht. Schade.
Adias QQ, dann muss man direkt wieder in das
Skript reinschreiben
Ja, aber so ist es auf jeden Fall
toll, also ich finde es auch super, dass man da jetzt
irgendwie echt eine ganz brauchbare Geschichte eingebaut hat und gut klar also Alphaiten ist nat auch nicht schlecht oder wie Python oder so aber genau Ja und dann daran angelegt wir haben
jetzt Farben ja schon angesprochen, vielleicht können wir noch über die
Tracebacks sprechen. Oh ja.
In 3.11 gab es ja jetzt schon
die Verbesserung, dass wir quasi in Tracebacks
diese
genaueren Positionen innerhalb von der Zeile kriegen.
Wie sagt man, Dächle, Johannes? Genau.
Dächle, ja, da wo ich
herkomme, sagt man Dächle. Sind halt auch
keine Dächer, sondern nur kleine Dächle.
So goes the Negra mit.
Genau, also es wird jetzt quasi
nicht mehr nur gesagt, das ist halt in Zeile 5 der Fehler,
sondern auch noch dieser Teil des
Ausdrucks ist
der Teil, der die Exception hervorgerufen hat.
Und das wird jetzt halt
auch noch jetzt dann farbig
irgendwie anders dargestellt als der Rest der Zeile.
Ja, auch sehr nützlich.
Tatsächlich so ein bisschen readable und
man muss sich erstmal
gucken, wo ist denn jetzt der richtige Teil vom Traceback, sondern
so irgendwie aufstehen.
Mit den Positionen, da habe ich
das Feature habe ich quasi
durch einen geschickten Tweet
provoziert. Da habe ich nämlich
einen Screenshot gefälscht, wo wir
also den hat es nie, das Feature
hat es bei uns nicht gegeben, aber ich habe
quasi einen fiktiven Traceback auf Twitter
fingiert und das hat
dann dazu geführt, dass
C-Python das wirklich entwickelt hat. Das fand ich
großartig.
Feature-Request durch Bosartigkeit,
Also wir können das und ihr?
Und dann gelogen.
Also ich hatte schon so einen Plan,
wir haben das ja dann auch irgendwann
gekriegt, aber so,
und Zephyton hat uns dann halt einfach ganz schnell überholt
und viel mehr Leute benutzen Zephyton.
Ja.
Genau, hier kann man es auch nochmal sehen.
Ja.
Jetzt natürlich nicht, wenn ihr zuhört, aber.
Ich kann es jetzt sehen.
Das einzige, was zählt.
Ja, ja.
Genau. Ja, auch schön. Man kriegt jetzt irgendwie gesagt, wenn man halt ein Modul genauso genannt hat wie eines aus der Standardbibliothek oder von sonstigen Dingen, die man installiert hat, glaube ich. Also es gibt so ein bisschen bessere. Oder wenn man halt irgendwie bei Keyword-Argumenten das irgendwie falsch übergeben hat, dann kriegt man jetzt auch. Da gab es vorher einfach nur so sehr, sehr kryptische Fehlermeldungen, die halt Anfänger auch sehr verunsichert haben. Das ist jetzt, glaube ich, auch besser.
Er macht das Vorschlag, er versucht sich
dran zu erinnern, was denn der Fehler schon sein könnte
und versucht so einen kleinen Hinweis dazu zu geben.
Ich meine, das für,
das wird halt in jeder Version jetzt gerade so
ein bisschen verbessert. Das ist schon so ein,
jetzt über einige Versionen so ein,
eigentlich so ein festes Bestandteil von
jedem C-Python-Release, dass sie halt
sich echt Mühe geben, noch so ein paar der schlechten
Fehlermeldungen zu verbessern.
Also ich unterrichte halt
Python-Anfänger jedes Semester.
Das macht schon echt einen Unterschied, ob da dann irgendwie
halt Abkürzungen vorkommen,
die noch nie gehört haben oder einfach nur Syntax-Error
ohne irgendwas
anderes steht und
raten müssen, was das Problem gewesen sein
könnte.
Und das mit den Vorschlägen, also wenn man sich halt
vertippt, wenn man irgendwie einen Namen vertippt,
das ist jetzt schon seit ein, zwei Versionen, dass sie dann
da dann Vorschläge machen könnten, was
halt der existierende Name mit der
kleinsten Edit-Distance ist.
Und jetzt haben sie es eben noch zusätzlich
hinzugefügt, dass es auch bei Keyword-Argumenten geht.
Ah, okay.
Ja.
Ja.
Also das ist auf jeden Fall
vielleicht die größte
User-Facing-Änderung, die man
halt bekommt, wenn man jetzt
Python 3.13 verwendet.
Ja.
Ja, ich würde auch sagen, wenn die ganzen Bibliotheken umgezogen sind, die man sonst
so nutzt, dann direkt
kann nicht mehr so lange dauern.
Wann zieht ihr denn immer um? Bei der 3.1?
Oder bei der Punkt 1?
Ich stelle eigentlich immer sobald,
ich probiere es vorher schon aus, also
einfach deswegen, um zu sehen, ob ich halt irgendwie
bei den Paketen, die ich
habe
oder die ich maintaine, ob da nicht dann
Dinge kaputt gehen, weil um mir dann halt,
damit ich den R gar nicht
nach der Release kriege, gucke ich das halt
Du bist dann einer von denen, die dann die Bug-Reports
machen, wenn was nicht geht.
Ja, aber meistens
ist das halt so abstrakt, dass
ich da gar nicht in Bugs reinlaufe.
Also bisher, wo ich
es probiert habe, hat es eigentlich immer funktioniert.
Und dann
updaten,
Das mache ich dann normalerweise, wenn es tatsächlich dann
erscheint. Ja, aber der Rest der Software,
den hast du ja noch nicht alles umgezogen.
Ich habe noch nicht alles umgezogen.
Ich habe auch bei einem Ding hat es nicht geklappt.
Das war irgendwie bei meinem
Fast Deploy Ding, habe ich nicht
updaten können auf 3.13, weil
irgendwas mit
PyTest und Async und
irgendwelchen Geschichten nicht mehr ging.
Dann, ich weiß es gar nicht
mehr so genau, dachte ich, okay, da warte ich jetzt mal noch
zwei Monate ab oder so, dann probiere ich es nochmal, mal gucken,
vielleicht ist es dann gefixt.
Aber genau.
Aber die Dinge, die ich angefasst habe,
seitdem Python 3 raus ist habe ich es umgestellt und es war bis jetzt auf das eine Ding kein Problem Ja die Data Science war immer so ein bisschen langsam Dann haben die immer diese Boundaries in ihren Versionen drin und das nervt immer so ein bisschen Ja ja gut okay
Ich habe jetzt auch gerade nicht so viel Data Science in der Hand.
Da ist mir das nicht so aufgefallen.
Weil ich auch da das Gefühl habe, dass
eigentlich viele Bibliotheken sich da jetzt inzwischen echt
Mühe geben und halt schon bei den
Betas und Release Candidates halt gucken, ob es geht
und dann schon. Ja. Also es ist
jetzt nicht mehr so, dass es ein halbes Jahr dauert oder so.
Mhm. Ja.
Ja, ich bin gespannt, wie lange es diesmal dauert.
Tatsächlich, ja.
Ja.
Wollen wir hier mit den großen Blöcken
weitermachen oder willst du so ein paar der kleinen Sachen sammeln?
Ich weiß nicht.
Es gibt noch große Blöcke.
Es gibt noch zwei große.
Das war auch schon ein großer Block.
Ich habe eben noch
die Dokumentation
durchgeschaut und den History-Modus,
den fand ich auch ziemlich gut.
Mit F2 kann man seine History ansehen.
Ist das auch persistent?
Ja, also ich habe eben in mein History reingeguckt in meiner Session, die ich gerade gemacht habe. Das geht sehr weit zurück. Ich war sehr überrascht, wie viel History da drin ist.
Oh, da muss man jetzt auch passen, was man da drin ist.
Das ist doch ein Fremdschatz ohne Klammern.
Ja, das will ich jetzt nicht, ohne Anwalt möchte ich diese Frage nicht beantworten.
Ne,
sehr viele schöne Sachen, aber
ich find's ja interessant, dass
3.13 so ein Release ist
mit einer riesigen Änderung
im Frontend, also jetzt diese
Rapid-Sachen, aber ja auch
sehr große Änderungen im Backend,
zu denen wir jetzt kommen.
Du meinst ja Snowgill.
Ja, da kann ich
zwei dicke Blöcke.
Dann machen wir Ditt.
Dann mach ich mir Notizen.
Ja, super, okay.
Alles klar.
Also beides sind ja eigentlich Sachen, die
eher so im...
Vielleicht nochmal für alle Leute, die einsteigen, die noch gar keine Ahnung
von Python haben, just in time.
Was ist denn das und
warum ist das interessant und warum ist das wichtig?
Vielleicht nochmal so einen kurzen Aufzug
lang und dann...
Ja.
Also C-Python ist
ein Interpreter,
also der Python-Code,
der ausgeführt wird, der wird erst nach
Bytecode übersetzt und der Bytecode wird aber dann
von einem in C geschriebenen
Interpreter ausgeführt und das
gilt als nicht so schnell.
Das ist einer der Gründe, warum Python
den Ruf hat, nicht so super schnell zu sein.
Und seit ein paar
Versionen gibt es da einiges an
Arbeiten vom Faster
Python Team,
was zum guten Teil von Microsoft bezahlt wird,
das zu verbessern. Und was die machen
ist,
immer noch auf dem Interpreter,
aber sie verändern quasi die Bytecodes
zur Laufzeit in Abhängigkeit
von den Typen, die in den Funktionen
verwendet werden, was dazu führt, dass
wenn ich halt an irgendeiner Stelle vor allem Integers
benutze, dass dann
für Integers angepasster Bytecode
verwendet wird, was die
Ausführung schneller macht. Und das, also
dieser Prozess, der hat
in 3.11 angefangen und
in jeder Version gibt es da eben so ein paar Verbesserungen.
Und wenn man dann aber darüber
noch hinaus will, dann muss man eben
oder was man dann eben machen kann,
ist nochmal zu einer anderen Technik greifen, das ist der sogenannte
das ist ein Time-Compiler und das ist eine Technik,
die von
allen schnellen JavaScript-Implementierungen
oder auch von Java verwendet wird
und da ist die Idee, dass man zur Laufzeit eben
Maschinencode erzeugt für die
Funktionen, die man gerade ausführen möchte
und das hat den Vorteil, dass man
also der Grund, warum man das zur Laufzeit
macht, ist, weil man erst zur Laufzeit die Typen
weiß, die in der Python-Funktion gerade verwendet werden
und dann kann man eben Code erzeugen,
der dann speziell angepasst
ist auf die Arten und Weisen, wie die
Funktionen, die man gerade ausführt, eben verwendet
werden.
Aber das kann ja auch sehr dynamisch
sein, aber man muss dann wahrscheinlich ein paar Mal die so
ausführen und dann gucken, was passiert und dann...
Genau. Also das ist der grundsätzliche Ansatz.
Man fängt eben an, das erstmal
so mit dem Interpreter auszuführen und dabei
macht man so ein bisschen Beobachtung, was für Typen eben
konkret verwendet werden, führt so ein paar Statistiken
mit und nur wenn
die Funktion besonders oft ausgeführt wird und man dann eben
mit der Zeit eben so ein paar Informationen zusammen
hat, wie die Typen so sind, dann fängt
sich an, quasi das so ein bisschen zu stabilisieren
und
das ist auch dann der Zeitpunkt, wo eben dann die Bytecodes
umgeschrieben werden, quasi jetzt seit
Version 3.11 und
jetzt, was jetzt neu ist
in 3.13 ist, dass dann eben
dieser zweite Schritt hinzukommt, wo man
dann eben nicht nur Bytecodes
umschreibt und so dann
für die Situation effizientere Bytecodes, sondern
eben auch noch, und das
ist komplett optional, also bisher in den Standard-Builds
ist das Feature nicht drin, das ist eher so ein
so ein Feature-Outlook
für zukünftige Versionen,
dass man eben
CPython auch neu bauen kann mit so einem
speziellen, experimentellen
Build-Time-Flag, was eben sagt, ich möchte jetzt gerne
einen JIT-Compiler einbauen
und dann wird eben zur Laufzeit
dieser spezialisierte
Bytecode genommen und daraus Maschinencode erzeugt.
Und die Hoffnung ist, dass es dann eben noch
schneller wird. In 3.13 ist es aber
leider noch nicht der Fall.
Sie erzeugen
Vielen Dank.
quasi Machine Code,
aber der, ja,
also, der macht's halt nicht,
das macht's trotzdem nicht schneller. Das ist so ein bisschen
die schlechte Nachricht, aber
das ist trotzdem okay, also weil
das Ziel ist quasi so, die ganzen,
das Fundament zu legen für Verbesserungen,
die dann in den nächsten Versionen hoffentlich
auch wirklich dazu führen, dass halt dann
C-Python das Sachen schneller ausführen kann.
Ja.
Und
das ist, glaube ich, eine spezielle Art von
Just-in-Time-Compiler oder so,
die es auch noch gar nicht so lange gibt.
Das geht irgendwie zurück auf so ein Paper
für Lua irgendwie, für so Copy
und Patch, ich weiß nicht.
Also so ganz kann man das nicht sagen.
Also es gibt die,
die Idee gibt es schon sehr lang.
Also das ist ein sogenannter Templated
und da ist die Idee, dass man,
also man hat ja dann diese spezialisierten Bytecodes,
also sowas wie
Add to Integers oder sowas
und die Idee ist, dass man
quasi für alle diese Bytecodes
so ein bisschen Maschinencode
vorbereitet, also zu dem Zeitpunkt,
wo man CPython baut.
Und das dann,
den vorbereiteten Maschinencode, also
diese Templates, die werden dann so zusammen
kopiert. Und die Idee von einem Template-Jit,
die ist relativ alt.
Aber was jetzt neu ist, und das
ist eben dieser Copy-and-Patch-Ansatz,
ist die Art und Weise, wie diese Templates
hergestellt werden. Und das ist eben
die Einsicht von einem Copy-and-Patch-Ansatz,
das ein Doktorand in
Kalifornien, glaube ich,
Haurang Su.
Und die Idee davon ist, dass man eben
den C-Compiler benutzen kann, um
diese Templates vorzubereiten. Das hat
viele Vorteile. Also man
benutzt den C-Compiler, man hat so kleine
Funktionen in C geschrieben, benutzt den
C-Compiler, um die dann nach Maschinencode zu
übersetzen. Und
das bedeutet insbesondere,
dass normalerweise, wenn man JIT schreibt,
dann muss man halt anfangen für verschiedene Maschinenarchitekturen
so ein Backend
quasi von
von Null auf
erstmal zu bauen. Und das ist halt super aufwendig,
gerade wenn man viele Architekturen unterstützen will,
wie das ja bei C-Python der Fall ist.
Und die Idee von dem Copy-and-Patch-Ansatz ist,
man benutzt den C-Compiler, um sich den Maschinencode
erzeugen zu lassen
und kopiert den dann so mit
Memcpy quasi an die richtige Stelle
und patcht dann eben noch so ein paar Stellen,
wo man dann irgendwelche Konstanten
noch so in den erzeugten Maschinencode
reinpatchen kann.
Und dazu benutzt man linker
Informationen, das ist wirklich
so ein relativ
kreativer
Ansatz, um halt mit
vergleichsweise wenig Aufwand,
also ohne so ein komplettes Backend schreiben zu müssen,
trotzdem relativ schnell, relativ
guten Maschinencode erzeugen kann.
Ja, ich glaube, das ist irgendwie
LLVM oder so wird da benutzt.
Genau, das ist auch so ein bisschen das Problem, also man braucht dann
genau die richtige LLVM-Version.
Wenn man die nicht installiert hat,
dann bringt einem auch die Flag nicht, man kann es
dann trotzdem nicht bauen. Ich habe es tatsächlich noch nicht geschafft,
das zu bauen, weil ich irgendwie das richtige LVM
noch nicht hatte oder was. Aber ich glaube,
die arbeiten da jetzt, also ich glaube,
auf dem CPython
Main Branch ist das jetzt auch irgendwie gelöst.
Da werden halt dann Sachen schon eingecheckt oder
also man muss dann
nicht mehr genau die richtige Point-Version von
LVM installieren. Aber
habe ich jetzt noch nicht ausprobiert.
Hat LVM nicht auch
so eine IR, eine Intermediate
Representation, die
auch irgendwie so abstrahiert ist?
Ich hätte sowas mal gelesen.
im Prinzip haben das die meisten
optimierenden Compiler, die haben halt irgendwie so eine Zwischendarstellung,
wo sie halt quasi
diese benutzen, um Code zu
optimieren. Und bei LVM ist die deswegen
relativ sichtbar, weil sie halt
gute Tools haben, um die dann in so eine
ASCII-Syntax zu printen und auch wieder zu parsen
und weiter zu verarbeiten.
Aber, ja.
Auch viele
technische Bauteile immer noch, ja klar.
Ja, es ist schon, also es ist
jetzt schon so ein bisschen, der JIT in
3.13, das ist schon wirklich eher so,
das sind so
vorbereitende Arbeiten. Also die Hoffnung ist eben,
dass das dann so in den
nächsten Versionen,
also ich meine, bisher ist das relativ unbefriedigend.
Wir haben einen JIT, der erzeugt ganz tollen
Maschinencode, aber es wird halt nicht schneller.
Und
es ist, ja,
cool, aber halt irgendwie auch nutzlos.
Also warum sollte man es machen, wenn
sich die Performance halt dadurch gar nicht ändert.
Aber die Hoffnung ist eben,
dass sie dann, wenn sie jetzt weitere Optimierungen einbauen
und
bei diesem Patching, da kann man noch so
ein paar extra
Instruktionen dann wegoptimieren, das haben
sie glaube ich jetzt auch im
Main Repository auch schon gemacht und
die Hoffnung ist, dass dann eben, wenn 3.14
dann da ist, dass erstens eben dann,
dass sie so ein paar Bugs gefixt haben, weil
hoffentlich eben ein paar Leute trotzdem die
den experimentellen
JIT halt mal ausprobieren und dann vielleicht
Bug Reports schicken
und dass sie dann halt in der nächsten
Version dann auch die Performance
noch ein bisschen verbessern können.
Und insgesamt finde ich den Ansatz halt cool weil er in Anbetracht der Tatsache dass das C halt jetzt nicht so gro ist was bezahlte Entwickler angeht ich finde es halt einen relativ pragmatischen Ansatz wo sie ohne jetzt irgendwie
also was ich Google vor acht
hatte, irgendwie, weiß nicht, 80
Leute oder so.
Das fand ich auch überraschend, ja.
Also das hier hat
quasi mit der kleinen Anzahl an Festangestellten
halt trotzdem
mit diesem Ansatz
vielleicht irgendwie recht pragmatisch irgendwo hinkommen
können.
Ich finde es auch cool. Ich finde es auch generell
cool, ohne dass es jetzt direkt eine Geschwindigkeitsverbesserung
bringt.
Einfach, weil, wie du gesagt hast, das ist
eine wichtige Grundlage, um dann irgendwann
die Verbesserungen rausholen zu können.
Deshalb.
Richtige Richtung, meiner Meinung nach.
Ja, ich meine, wenn man jetzt nicht so viele Ressourcen hat, muss man sich halt überlegen,
wie man die ökonomisch einsetzt. Und wenn man jetzt
sieht, was vielleicht
V8 irgendwie macht oder so, und das
dann halt einfach später, wenn sich herausgestellt hat,
was da gut funktioniert, halt dann
die wesentlichen Teile nimmt oder so.
Wobei, ich weiß nicht genau,
gibt es irgendwo quasi den gleichen
Ansatz, der dann schon gut funktioniert?
Weil V8 ist ja dann wahrscheinlich
doch eher noch deutlich komplizierter oder so.
Sehr viel komplizierter. Also V8 hat halt nicht
nur einen JIT, sondern irgendwie drei oder so.
Oder vier.
Also halt dann erstmal einen, der
quasi schlechten Code sehr schnell erzeugt und
dann etwas besser optimiert, sehr gut
optimiert. Dann haben sie noch einen komplett getrennten JIT
für WebAssembly.
Also das ist schon
und dann natürlich auch wirklich dann
quasi richtige Backends für ganz viele verschiedene
Hardware-Architekturen.
Also das ist schon ein Aufwand,
den meiner Ansicht nach mit dem
jetzigen Funding das C-Python-Thema
erstmal so nicht hinkriegen kann.
Also
genau.
Transpilen nach, einfach Python transpilen
nach JavaScript.
Ja, oder
nach WebAssembly.
Das stimmt, das ist ja tatsächlich eine unterstützte
Plattform, ja. Genau, es ist
eine Tier-2-Plattform. Ja, genau, das stimmt.
Also das ist
so ein kleines Ding. Es gibt drei neue Plattformen
in 3.30. Ja, super spannend.
Soll ich mal, ich lese mal hier vor.
Die erste,
die Tier-2-Plattform heißt
WASM32-WASI, also eine
WebAssembly-Plattform.
CF, weißt du, was
Tier-2, weißt du, was die Tiere bedeuten?
Ich glaube irgendwie, die machen Aussagen
darüber, wie viele Buildbots sie haben
und was sie so versprechen
an Support
über die Version.
Da gibt es irgendwie ein Papp dazu.
Das kann man nachlesen.
Ist jetzt eine höhere Zahl besser oder eine kleinere?
Ich glaube, eins ist am besten.
Die niedrigeren Zahlen sind besser, oder?
Je näher du am Ziel bist,
an der Spitze, umso besser ist es.
Also WebAssembly ist jetzt
Tier 2 Supported Plattform mit vielen
Bildbots und viel Stabilität über die Version.
Und es gibt zwei neue
Plattformen, die
da war ich sehr überrascht, dass es die gibt,
nämlich Android und iOS.
Das sind Tier 3, Officially Supported
Plattform.
War ja
früher ein Riesenthema,
wenn man Android, wenn man Python auf
Android ausführen wollte oder noch schlimmer, Python auf iOS.
Das
ging auch schon sehr lange.
Das ging auch schon sehr lange.
Es ist ja auch kein Problem, du kannst ja einfach
den Interpreter auch
kopilieren und so. Und da ging auch
NumPy und so, das ging alles.
Und es gab da so eine schöne App
namens Pythonista.
Aber
die hat natürlich eigentlich schon gegen die
App-Store-Regeln verstoßen.
Genau, richtig.
Also ich meine,
mein Beowulf-Cluster aus
iOS, aus iPhones.
Was ist genau die Regel?
Also die
App-Store-Regel ist,
du darfst da nur
Dinge installieren. Also
kompilierter Code, ja, aber auch irgendwie
C++, C, irgendwie
Objective-C
und
was war es noch?
Ich weiß nicht, vielleicht
eine Handvoll Sprachen.
Die Regel, dass du keinen dynamisch erzeugten
Code nachladen kannst. Ja, das genau.
Weil dann kann
Apple ja nicht mehr prüfen, ob du nicht irgendwelche
schlimmen Programme nachlädst.
Ihre Sandbox-Tests oder was auch immer.
Ja, also
eigentlich geht, und du konntest halt
mit Python, da kannst du halt auch einfach
quasi Python-Code auf deinem Telefon ausführen und
das geht natürlich eigentlich
nicht.
Aber es ging dann doch.
Ja, aber bei Android wäre das ja prinzipiell
gegangen, nur war halt das
Tooling bisher immer sehr umständlich.
Also ich weiß, dass es Beware gibt und es gab
auch Kiwi und
viele andere Ansätze schon, aber
die waren schon immer sehr umständlich.
Ja, und wenn es jetzt...
Ja, genau, das ist schon noch wichtig,
dass es jetzt halt quasi von den
CPython-Entwicklern halt mit
versorgt wird. Ich habe jetzt nochmal nachgeschaut,
was genau die Tiers bedeuten Also Tier 1 ist halt das richtig gute Zeug also so Mac OS Windows Linux Tire 2 braucht man halt irgendwie Buildbots und mindestens zwei
CPython Core Developer, die
eben die Plattform unterstützen
und wenn es da
Buildbot Failures gibt, dann
werden CPython Releases dadurch
blockiert. Und Tire 3
heißt eben
Buildbot einen Core Entwickler,
wenn es da Bugs gibt, dann
kann C-Python trotzdem
released werden.
Also es ist quasi so, wir geben uns Mühe,
aber wenn jetzt irgendwie
es nur noch irgendwie einen
bekannten Bug auf Android gibt, dann
releasen wir halt möglicherweise trotzdem.
Und der Core-Developer, der für
Android und iOS zuständig ist,
ist übrigens Russell Keith-Mede.
Der, der auch Beware
schon gemacht hat, der das schon lange macht.
Der hat es jetzt offenbar
eben reingekriegt.
Der diesen tollen Vortrag gehalten hat,
irgendwie Black Swan Events
für, ich weiß gar nicht, wie der
Titel von dem Vortrag hat, da ging es halt genau darum,
was ist eigentlich, sind die bedrohlichsten
Geschichten, die jetzt Python noch
zustoßen können und ein
Szenario war halt so, ja, was
ist, wenn irgendwie künftige
Generationen gar nicht mehr vor so riesigen Desktop-Dingern
sitzen
oder so, ich kann das gar nicht verstehen, ich finde das total toll,
aber eher vielleicht auf Tablets oder
Telefone gucken und dann einfach
in Vergessenheit gerät, dass es Python überhaupt noch gibt, weil
Python gibt es halt nicht auf iOS
oder so. Und
dagegen sollte man vielleicht was tun. Und dann, ja,
jetzt ist halt was passiert und das sieht ja schon ganz gut aus.
Ja, ich habe das bei beiden Studenten.
Man muss nach Studenten echt. Also ich habe halt,
also ich mache eine Python-Einführung
für alle, also da dürfen Informatiker
nicht hin. Und das heißt, ich habe auch
Studierende aus allen Fächern
und jetzt
nicht viele, aber da gibt es halt dann immer wieder
Teilnehmende, die dann halt einfach auch
nur ein Tablet haben. Und
Tier 1? Ja, also
wir haben kein Tier 1 Gerät, genau.
Jupiter Notebook. Wir haben dann halt entweder
die Möglichkeit, das irgendwie über Google Callup zu machen,
also ich mache alles mit Jupiter Notebooks, aber das ist halt
dann immer so ein bisschen nervig mit
die Input-Dateien hochladen und so Zeug
und dann können die sich ins Rechenzentrum
setzen, da hast du es auch installiert, aber das ist natürlich auch
total nervig, du musst immer deine Übungsaufgaben da machen
und so eine richtig
also richtig guten Jupiter Support
auf so einem
iPad gibt es halt einfach auch noch nicht.
Es ist schon einfach
im Vergleich zu installiert
Anaconda, dann ist alles in Ordnung, ist es halt schon einfach
sehr frickelig.
Ich muss
noch dazu sagen, nicht, dass wir jetzt hier Personen
übergehen. Es gibt noch zweite
Maintainer für diese Plattform, neben Russell
Keith-McGee. Für Android
gibt es noch den Peter Victorin
oder Peter Victorin
oder wie auch immer man das aussprechen mag.
Einer von den drei.
Und dann gibt es noch für iOS
gibt es noch den NetDaily.
Also wieder so eine tolle Name-Conning gemacht.
Da muss ich ja nochmal kurz zum Sammelkartenspiel
zurückkommen, was er sich kurz angegeben hat.
Weil ich ja auf dem
Talk von
Lukas Langa, der ja in diesem
tollen Rappel irgendwie dann ein kurzes
Befehlchen eingeben konnte, um
das Bild von, ich dachte es wäre
John Romero gewesen, was eigentlich
Pablo Calderon da gerade war.
Und dann hatten wir kurz dieses Thema.
Und ich finde das eigentlich eine coole Idee, dass man demnächst auf den
Pycons, so Sammelkartenspiele.
Wir bringen die erste Edition mit,
dann machen wir den Python-Podcast, das ist dann
Team One.
Ich finde, die
sollten das selbst verteilen und nur
die Leute, die bei den Vorträgen waren, kriegen auch so
eine Karte. Also ich glaube, man kann die
verkaufen. Ich vermute, dass das
wirklich die Art und Weise ist, wie man endlich
mal gutes Funding für 10 Seiten findet.
Ja, dann liebe Zuhörer,
schreibt uns, ob das die Wahrheit ist und dann
müssen wir das wohl machen. Damals als NFTs
Neuwagen gab es ja auch so Sachen, die dann diese Bilder
dann gemacht haben und das dann als NFT.
Ja, aber das mit den NFTs
ist immer noch die Zukunft.
Ich weiß nicht.
Der einzige Vorteil von AI ist, dass die die NFTs verdrängt haben.
Für einen ganz kurzen
Moment waren Grafikkarten wieder billig und
dann hat die AI zugeschlagen.
Tja.
Okay, also es gibt zwei neue Plattformen,
Android und iOS und
es ist eine großartige Sache, finde ich.
Und WebAssembly.
Und WebAssembly, ja genau.
WebAssembly ist quasi aufgestiegen.
Da müssen wir auch unbedingt mal was machen.
Im Skripten zu WASI.
Wir müssen noch über den
anderen JIT reden.
Es gibt nämlich zwei
JITs in 3.13 und der eine ist der
coole, der quasi das irgendwann mal schneller machen soll,
der aber quasi standardmäßig gar nicht eingebaut
ist und dann gibt es aber den anderen,
der quasi standardmäßig eingebaut ist, aber
von ganz anderem Zweck und
ich glaube in einer der Core.py
Folgen ist Pablo Galeno
sehr stolz drauf,
dass er quasi den ersten T-Python-Jit
gemerged hat und geschrieben hat.
Und das ist n der Jit der benutzt wird um besseres Profiling machen zu k Und das funktioniert mit dem Linux Perf Profiler Und das Problem wenn man jetzt so ein
also der Perf Profiler ist eigentlich so ein Profiler für C.
Also man kann halt sehen, was macht der Kernel,
was macht der Linux Kernel,
oder was machen eben auch die C-Programme,
die im User Space laufen.
Und man kann eben sehen,
die und die C-Funktionen werden jetzt gerade so und so oft ausgeführt.
Das ist so ein Sampling Profiler,
also der Profiling-Aufhalt ist sehr gering.
Das Problem ist jetzt aber, dass wenn man quasi Python-Programme profilt,
dann sieht man natürlich jetzt gar nicht, welche Python-Funktionen wie viel Zeit verbrauchen,
sondern man sieht dann die ganze Zeit nur, dass halt irgendwelche Interpreter-Funktionen ausgeführt werden.
Und da gibt es jetzt eben dieses neue Feature, den PerfJit.
Und da ist die Idee, dass man so eine ganz, ganz kleine, ein paar wenige Maschinencode-Instruktionen lange Funktionen generiert zur Laufzeit.
Und für jede Python-Funktion eben genau eine so eine Funktion.
und das hat dann den Vorteil, dass Perf eben die ganzen
Python-Funktionen voneinander unterscheiden kann.
Wenn man eben nicht nur eine
interpretierige Python-Code-
Funktion dann sieht in Perf,
sondern man sieht dann eben diese
neu generierten Mini-Funktionen
und dann gibt es irgendwie so einen Rückübersetzungsschritt,
wo man dann eben sagen kann, okay,
diese neue, neu generierte
Assembly-Funktion an Adresse sowieso,
die entspricht eben der Python-Funktion
f,
wie auch immer und so kann man dann
eben mit Perf sehen, in welcher
Python-Funktion man lange Zeit verbraucht
hat.
Das hört sich nach einem sehr umständlichen Weg
an. Es ist erstaunlich
umständlich, aber Profiling ist auch echt
einfach ultra kompliziert.
Ja, gut, klar.
Also es gibt ja
irgendwie so
eine große Sammlung an Profilern für Python
und für andere Sprachen, aber
C-Profile hat halt einfach einen riesen Overhead.
Dann gibt es verschiedene Sampling-Profiler für Python.
Wie heißt dieser? PySpy
oder so, der funktioniert, glaube ich, ziemlich gut.
Habt ihr den mal benutzt?
Nee, ich weiß gar nicht.
Ich hab wieder vergessen, was ich... Ich hab mal irgendwas benutzt.
Gibt es einen, der Hotspot heißt?
Aber Hotspot ist, glaube ich, eine UI
nur, oder? Wo da die Samples herkommen, weiß ich nicht so genau.
Ja, und dann
gibt es unseren quasi, WMProf,
der ist aber nicht mehr so richtig maintained. Also auf
Piper schon, aber auf Zip hat er nicht so richtig.
Ist auch Sampling. Also Sampling heißt halt,
dass man quasi nicht jeden Funktionsaufruf
mitschreibt, was halt sehr, sehr hohen Overhead hat,
sondern einfach nur so tausendmal pro
Sekunde halt guckt, welche Funktionen gerade auf dem Stack sind
und dann sagt, so statistisch gesehen
sind das die Funktionen halt, die dann viel
Zeit brauchen.
Und Perf ist halt auch so einer und der
Vorteil von diesem Sampling-Ansatz ist, dass man den
Profiling-Overhead eben beliebig klein
machen kann. Man kann halt die Anzahl der Samples immer
kleiner machen und wenn es dann nur noch 10 Samples
sind, dann ist es halt quasi
genauso schnell, wie es vorher auch war.
Man hat aber auch schlechtere Informationen
dann sozusagen. Also man kann dann quasi
die Abwägung zwischen Genauigkeit
der Informationen, die man hat und Overhead
beliebig ausbalancieren.
Und Perf funktioniert halt sehr gut,
wenn man da gute Informationen darüber kriegt,
was auf dem C-Level
funktioniert. Aber die
Informationen, welche Python-Funktion da jetzt gerade involviert ist,
die geht halt verloren. Und die kann man dann eben wieder
zurückkriegen mit diesem neuen
Perf-Integration-Feature,
das jetzt in 3.13 released wurde.
Aber ist auf jeden Fall frickelig.
Also ich glaube, auf Mac ist es ja auch
total schwierig, weil man
braucht halt so ausführbare Blöcke von
Maschinencode und
Apple hat da halt auch einiges an Security-Featuren.
Man muss dann quasi
sicherstellen, dass man so einen Code-Block eben
so hin und her
wechselt zwischen, ich kann den Code-Block
schreiben und ich kann den ausführen. Also man kann ihn nie gleichzeitig
schreibbar und ausführbar
haben, um eben so
Security-Exploits unwahrscheinlicher zu machen.
Und bis man das ganz genau
richtig hingekriegt hat,
das ist tricky. Wobei Perf ist eigentlich nur ein Linux-Projekt.
Insofern habe ich, glaube ich, gerade Quatsch gesagt.
Achso, das ist genug.
Ja, ich will,
mit MacOS, ich glaube, der letzte Copy-By-
Episode war auch irgendwie
drin, dass der Memory-Profiler
Memory, den Pablo
gerade aufgeschrieben hat, der
hat auf MacOS nicht funktioniert, weil
irgendwie
sie die
Maloc-Funktion irgendwie, also nicht die
Unbekannt haben.
Von einer Mac-Version
zur nächsten.
Kann man auch schon mal machen.
Warum nicht?
Ja, ich finde es cool, dass es Leute gibt, die sich dann wirklich
mit den Linkern auf allen Plattformen rumschlagen,
um dieses Problem zu lösen.
Ja.
Ja, ja, Profiling, tja.
Das ist...
Wenn das so low-level ist, sinkt dann eigentlich der Tierassistent hier null?
Sorry.
Couldn't resist.
Es ist interessant.
Aber was ist denn das nächste Thema
auf unserer Liste?
Ja, na gut.
Dann, was jetzt auch drin ist,
das wurde auch viel diskutiert,
ist halt, ja es nennt sich jetzt Free Threading
früher, No-Gill,
dass man halt optional
den Gill ausschalten
kann, ist auch eine, muss man
Compiler-Flex setzen und dann neu
kompilieren oder halt
sich entsprechendes Binary halt via
was auch immer, wie man halt so Python
installiert, halt das damit
installieren und dann kann man das benutzen.
Tja.
Was macht das denn überhaupt, der G?
Oh.
Ja, es sorgt eigentlich im Grunde dafür,
dass halt
der,
dass immer nur,
dass Python immer nur
auf einer CPU läuft,
wenn ich das jetzt mal ganz
Aber das ist ja noch eine Auswirkung,
das ist ja nicht das, was der macht.
Nee, ich glaube, das ist tatsächlich das, was
Also. Und es stimmt auch nicht.
Es kann auf vielen CPUs laufen,
nur halt immer nur auf einer gleichzeitig.
Ja, immer nur auf einer gleichzeitig, genau, das meinte ich.
Ja, ja, genau.
Aber das ist ja nur eine Auswirkung, das ist ja nicht der Grund, warum man das macht.
Nee, der Grund, warum man das macht, ist, dass halt
viele Operationen, ja, gerade was
Memory Management angeht, halt
man dadurch halt
nicht, da muss man halt nicht locken,
was man ansonsten halt müsste, weil wenn man
den Reference-Counter von irgendeiner
Datenstruktur erhöht.
Also ganz allgemein, die ganzen Datenstrukturen
sind halt erstmal nicht Thread-safe.
Und das bedeutet, dass wenn man die
von mehreren Threads aus benutzt,
dass die dann kaputt gehen können.
Insbesondere das Reference-Counter. Um das zu verhindern,
müsste man halt locken und wenn man lockt, dann wird alles
so langsam, dass
man keinen Vorteil mehr davon hat, dass man mehr
CPUs hat. Also ich glaube,
die ersten Versuche,
das Projekt hieß
irgendwie Gilectomy oder so.
Es gibt noch ein älteres.
Also so alle paar Jahre kommt mal jemand
und schaut Versuch aus.
Doch, bei 1.1 wieder nicht genau aufgepasst.
Ja, genau. Also es war
wirklich so 1.6 oder irgendwie so was ganz frühes, wo das
dann...
Kann gut sein. Aber da war das auch schon...
An den Versuch erinnere ich mich noch und da war es
halt so, dass wenn man das einfach nur versucht hat
zu locken und auch nicht irgendwie
was Kompliziertes gemacht hat, sondern einfach mal
probiert hat, es nicht ganz so langsam hinzukriegen,
dann war irgendwie
der Performance
war so Faktor 40
weniger
und ja,
dann hat man es auch
Single Threat Performance,
genau.
Und dann hat man es runtergekriegt
mit Tricks auf 20,
Faktor 20
irgendwie schlechter,
aber das ist halt immer weit,
noch sehr, sehr weit entfernt
von irgendwie,
man will das verwenden,
weil wenn das so eine Auswirkung hat,
dann lohnt sich das eher nicht.
Aber was macht man denn dann
mit den ganzen Objekten,
die da irgendwo rumliegen?
Wie rückt man die denn dann weg?
Wie meinst du?
Wenn man nicht mehr braucht.
Du meinst Garbage Collector?
Ja. Gut, das ist nochmal ein anderes...
Der weiß ich gar nicht, ob der irgendwie...
Aber der Reference Count ist ja dafür da, oder?
Dass man das wieder wegräumen kann, wenn es auf 0 fällt.
Also an dem Garbage Collector hatten die quasi bei diesen
Gilectomy und so Versuchen auch nichts geändert.
Was sie gemacht haben, ist jedem Objekt einen Log zu geben
und immer wenn ein Threat mit dem
Objekt eben interagieren will, insbesondere
wenn eben der Reference Count
verändert wird, musst du halt dir erstmal
das Log holen für das Objekt.
Und weil halt
ständig, um irgendeine Operation
mit dem Objekt machen zu können, du halt ständig an dem
Reference-Count rumoperierst,
ja, musst du halt ständig
auf das Log warten und das hat
halt die bisherigen Versuche,
den Guild zu entfernen, einfach sehr, sehr teuer gemacht.
Also die
Single-Thread-Performance
eben komplett ruiniert.
Und jetzt kann es doch
dann eigentlich sein, dass so ein Objekt dann einfach
weggeräumt wird, obwohl es noch gebraucht wird?
Jetzt wird es super kompliziert.
Also wir haben
jetzt, genau, es gibt den Guild, der Guild verhindert, dass
mehr als ein Thread-Python-Core ausführen kann.
Also gleichzeitig auf einem Core.
Jetzt kommt eben der nächste Versuch
und das ist von Sam Gross bei Mitha
über viele Jahre lang eben probiert worden
und der hat einige sehr clevere neue Ideen da reingebracht,
um zu versuchen eben die Verlangsamung
für Single-Thread-Performance, soweit es geht, zu minimieren.
Und da gibt es eben so eine ganze Bandbreite an Optimierungen,
womit er dann eben versucht,
genau diese Probleme in den Griff zu kriegen.
Und eine davon ist eben die Beobachtung,
dass die allermeisten Objekte,
die werden halt trotzdem nur von einem Thread benutzt.
Also wenn ich halt eine Funktion habe,
die irgendwie eine Liste erstellt
und da was rein appendet und so weiter.
Selbst wenn auf ganz vielen anderen Threads
halt noch Sachen laufen,
kommt halt kein anderer Thread
erstmal standardmäßig an diese Liste ran.
Das heißt, die erste Optimierung ist zu sagen, für die ganzen lokalen Objekte, die ich also nur von einem Thread überhaupt jemals anfasse, muss ich für das Updaten der Reference Counts eben nicht locken. Also das ist quasi so die wichtigste Optimierung.
genau, das heißt
Biased Reference Counting, weil quasi
dafür gesorgt wird, dass man eben
nicht geshared Objekte
die nur von einem Thread
eben erreichbar sind
dass man da eben das Locking quasi
sein lassen kann
jetzt gibt es aber nat eine ganze andere Klasse an Objekten die werden halt von ganz vielen Objekten von ganz vielen verschiedenen Threads angefasst also halt alles was die ganzen Build also
None,
die ganzen Typen und dafür gibt es dann
also wieder einen ganz anderen Ansatz und da ist nämlich die Idee,
dass man da halt sagt,
diese Objekte, die können eh nicht sterben,
also sowas wie None.
Warum nicht wegräumen?
Dann gibt es halt einfach immer
und das gilt halt
für ganz, ganz viele andere Arten von Objekten auch,
die meisten Typen gibt es halt immer,
Und die werden dann so unsterblich gemacht.
Ist das dann ein Singleton?
Also, nein, das ist auch ein Singleton, ja.
Aber das ist nicht das einzige Kriterium.
Man kann sich schon noch vorstellen, dass es Singletons gibt,
die halt vielleicht auch sterben könnten.
Also, die man vielleicht wegräumen will.
Aber es gibt, also die ganzen eingebauten Sachen,
die werden einfach nie, also die werden halt nie gar nicht collected.
Und deswegen kann man da eben auch sagen,
da kriegt jetzt der Reference-Count irgendwie so einen speziellen Flag.
und dann erhöht und senkt man den Reference-Count eben auch nicht.
Und dann muss man die auch wieder nicht locken.
Und dann gibt es noch den dritten Ansatz
und das ist das sogenannte Deferred Reference-Counting
und da verstehe ich die ganzen Details auch nicht komplett.
Aber da ist eben die Idee,
dass man eben das Erhöhen und Senken des Reference-Counts
nicht mehr die ganze Zeit up-to-date macht,
um eben zu ver...
Also da geht es um Objekte, die so dazwischen sind,
also die von mehr als einem Thread erreicht werden können.
Also man erhöht, aber man reduziert das nicht oder beides nicht?
Ich glaube beides nicht.
Also und dann, das sorgt aber dafür,
dass wenn der Reference-Count null wird,
dann kann man die auch nicht sofort einsammeln,
sondern da muss man eben warten
und dann warten, bis alle Threads
zu irgendeinem wohl definierten Punkt kommen
und dann kann man schauen,
ob es nicht noch irgendwelche References
in den Stackframes gibt oder so,
die dann noch dazugezählt werden müssen,
deswegen eben Deferred.
und nur wenn man da dann eben überall nachgeschaut hat
und feststellt, oh okay, das Objekt,
das ist jetzt wirklich auch von keinem Frame-Objekt
mehr erreichbar, dann kann ich das wirklich wegräumen.
Und das hat auch komplizierte
Interaktionen mit dem
Memory Allocator,
da wechselt nämlich
die Free-Threading-Version auch zu
Mimalog, das ist so ein von Microsoft
geschriebener C-Memory
Allocator, der eben auch besonders gut mit
Multi-Threading
interagiert und da wird
auf eine für mich noch nicht ganz
verständliche Art und Weise eben mit
besonderen Meme-Log-Features dann
erreicht, dass genau das Richtige
passiert.
Dass genau das Richtige passiert, das ist immer toll.
Ja, das ist auch.
Ja, aber das hört sich jetzt so ein bisschen an wie
so Eventual Consistency für den
Reference-Counter. Ja, ich glaube, das ist genau.
Weil im Endeffekt
ist die Zahl, die in dem Reference-Counter
da drin steht ja auch, nur dann wichtig,
wenn es eine Null ist.
Also jetzt,
Vorbemerkung ist, das gilt
alles nur für Objekte, die eben von mehr als einem Thread
erreicht werden können. Ja, okay, klar.
Genau, aber für die hast du absolut recht,
da ist eben da eine Zahl
drin, die nicht unbedingt wirklich
alle References von allen Threads
dann
widerspiegelt und um das
Objekt dann wirklich wegräumen zu können,
muss man halt nochmal nachschauen, ob das
wirklich alles so gestimmt hat.
Genau, aber für mich der Knackpunkt, an dem das überhaupt funktionieren kann, ist, dass die Zahl, die tatsächlich in dem Reference Count drinsteht, die meiste Zeit ja uninteressant ist. Solange die Zahl größer als 0 ist, ist der exakte Wert nicht wichtig.
Ja, absolut.
Sondern es wird erst dann wichtig, wenn der exakte Wert 0 erreicht.
Also so ein bisschen so, als wenn du die Box aufmachst und guckst, ob die Katze noch lebt.
Ja, aber du musst es ja nur aufmachen, wenn du es wirklich wissen willst. Solange es dich nicht interessiert, ob die Katze noch lebt, kannst du außen den Schalter drücken oder nicht drücken, so viel du willst. Und ich glaube, das ist für mich in meinem Kopf so ein bisschen der Kern an der Sache, warum das überhaupt funktionieren kann.
Weil wir nur zu sehr wenigen Zeitpunkten wirklich den exakten Wert wissen müssen, weil wir nur zu wenigen Zeitpunkten wirklich draufschauen müssen und sagen müssen, okay, jetzt muss ich wissen, ob die Zahl wirklich null ist oder nicht.
Ich glaube, Eventual Consistency ist auf jeden Fall ein super Gedankenmodell, weil Eventual Consistency wird ja auch quasi aus den gleichen Gründen eingeführt. Also natürlich ist es besser, wenn meine Information halt die ganze Zeit konsistent ist. Aber das hat halt im Datenbankbereich dann auch entsprechende Nachteile, Performance-Nachteile.
Ja, und gerade in verteilten Datenbanken.
Genau. Und quasi aus den gleichen Gründen,
für mich halt quasi im viel, also auf einem ganz anderen Maßstab
natürlich, aber werden die Deferred Reference Counts verwendet.
Ja, cool. Super coole Sache.
Ja, genau. Aber es ist halt wie gesagt auch bisher noch
experimentell und standardmäßig nicht eingebaut.
Da gibt es auch noch so ein paar Nachteile.
Die Single Thread Performance ist auch quasi
in der Free Threading Version schlechter im Moment.
Ich glaube vor allem weil sie im Moment eben noch dieses Bytecode wo wir vorhin in der JIT dr gesprochen haben noch abschalten m Eben aus dem Grund dass wenn ich quasi mehr als einen Thread habe der die gleiche
Python-Version ausführt und alle wollen
jetzt den Bytecode umschreiben, dann habe ich
da eben auch wieder quasi
Mutationen
derselben Datenstruktur von einem Thread
und da will ich das nicht immer locken und
deswegen haben sie das bisher einfach abgeschaltet
in der Free-Threading-Version
und das sorgt dann eben für, weiß ich nicht,
10%, 20% Verschlechterung
der Single Threading Performance.
Oder
es gibt eben, ein anderes Problem
ist, es gibt eben einfach ganz, ganz viel
Python-Code, der so in der Welt ist,
in irgendwelchen Bibliotheken, der einfach nicht Thread-Safe ist.
Bisher konnte man sich halt
so ein bisschen immer so
durchmogeln mit der Tatsache, dass
meistens ist man halt vom Girl geschützt
und so viel
Multithreaded Python-Code gibt es halt auch oft nicht
und deswegen
finden wir jetzt wahrscheinlich die nächsten
zehn Jahre Locking-Bugs
in allen PyPI-Bibliotheken.
Und
für die C-Extensions gilt das natürlich erst recht.
Ja, aber die C-Extensions
hatten ja vorher schon die Möglichkeit,
den GIL freizugeben. Also NumPy
zum Beispiel.
Ja, sobald ich quasi was mache, was dann
wirklich weit
weg von jedem Python-Objekt.
Genau, was aus dem Python-Memory-Management
rausgeht.
Ja, gut, okay.
Also die große
Matrix-Multiplikation, die NumPy macht,
die hat halt mit Python dann nichts mehr zu tun.
Und die konnte halt dann auch schon
auf dem extra Core dann
den Lüfter heiß
laufen lassen.
Ja, das sind die wenigsten Operationen, das ist mir schon klar.
Die prinzipielle Möglichkeit gab es
vorher schon.
Wenn ich mein eigenes Memory-Management mache,
bin ich nicht auf den Gelenk.
Ja, aber da hat man sich dann ja auch wahrscheinlich
schon Gedanken drüber gemacht, wie man das dann tut,
ohne dass es kaputt geht. Oder wenn man
es falsch gemacht hätte, wäre es schon aufgefallen.
Aber ganz viel von dem, wo man sich keine Gedanken
gemacht hat, das wird dann jetzt wahrscheinlich irgendwann
auffallen, dass das nicht ganz richtig war.
Das ist auch in der Standardbibliothek. Da gibt es einfach ganz viele
solche Stellen. Wir hatten heute so ein
Bug-Report. Also
es gibt das Line-Cache-Modul.
Das kennt keiner, weil man das quasi
selber nie benutzt. Das ist quasi dafür da, dass wenn
ich Tracebacks kriege,
dass die Source-Code-Zeilen halt quasi
aus den Python-Dateien geladen werden
zum Anzeigen. Und das wird gecached, damit ich nicht
jedes Mal die Dateien eröffnen muss.
Und wenn ich jetzt aber quasi Python-Code
zu Laufzeit erzeuge mit exec oder so,
dann kann ich quasi auch da dann
in den Line-Cache so Sachen reinschreiben
und die will ich aber vielleicht auch
wieder löschen, damit eben der
Cache nicht mehr und mehr Speicher verwendet.
Und dann hatten wir einen Bug von SymPy oder so,
die schreiben da eben so Sachen in den Line-Cache
rein und löschen die dann auch wieder und dann
stellt sich halt raus, dass der Line-Cache nicht thread-safe ist.
Also wenn ich das quasi von mehreren
Threads mache, dann kriege ich halt irgendwelche
komischen Exceptions von irgendwelchen
internen Line-Cache-Funktionen, von denen
ich noch nie gehört habe.
Und ja, also wenn
klar, das ist jetzt alles schon
extra ultra speziell, aber
so Stellen wird es halt in der Standardbibliothek
auch noch an anderen Plätzen
geben, dass man halt dann feststellt, okay, es gibt
hier Python-Code. Da hat
halt noch nie jemand drüber nachgedacht, was passiert eigentlich,
wenn ich das auf vier Threads gleichzeitig ausführe.
Ja, und eigentlich sollte man sich ja
da auch keine Gedanken, beziehungsweise es ist ja der
Ansatz, dass man sich keine Gedanken
drüber machen soll. Viele andere Sprachen lösen
das Problem halt auf eine andere Art und Weise, indem
sie sagen, man muss jetzt halt selber explizit drüber nachdenken.
Also man wird da...
Das ist ja der Ansatz, dass man es in Python nicht machen muss.
Man wird in Python schon drüber nachdenken müssen. Also wenn du halt so was hast,
wie du hast irgendein globales Dictionary
und das wird jetzt von zwei Threads mutiert und ich habe
aber in beiden eine Iteration
darüber, dann sind halt
wahrscheinlich die Invarianten der Schleife kaputt. Egal,
ob die Datenstruktur jetzt...
Also klar, die Datenstruktur soll nicht kaputt gehen,
aber ich kann ja trotzdem dann plötzlich den Key verlieren,
den ich erwarte, dass er noch in der Dictionary drin ist.
Ja, auch diese ganzen Probleme,
die bei Multithreaded Programming auftreten,
also allein, wenn ich irgendeine Variable habe,
die ich inkrementieren möchte,
dann muss ich ja schon irgendwie einen Mechanismus haben,
der Multithreading ermöglicht.
Aber das ist ja noch mal eine ganz andere Ebene.
Ja, klar.
Und solche Bugs haben wir definitiv auch schon gesehen.
sowas wie, ja die sind ja auch leicht
also ich meine, die hat man ja sofort
ja, also sowas wie self.counter
plus gleich 1, das ist halt nicht
Atomic in
der Free-Threading-Version, ja also
wenn ich da mehrere Threads hab, die das machen
dann, ja
dann können halt komische Sachen passieren
Aber da gab's auch früher schon so
gab's auch früher schon so Stolperfallen
wo manche Sachen in Python Atomic
aussahen und dann aber irgendwie auch nicht
Genau, also viele von diesen Bugs
die sind quasi bisher auch schon, das sind jetzt quasi keine Bugs, die nur in Free Threading wirklich vorhanden sind.
Das sind quasi latente Bugs die es schon immer gibt die auch quasi in der ganz normalen GIL von Python Bugs sind und Crashes verursachen k
Nur bisher waren die quasi
einfach viel unwahrscheinlicher, dass man die wirklich
dann auch trifft, diese
Bugs. Aber
dadurch, dass jetzt eben mehr Leute versuchen
werden, mit Multithreading
in der Free-Threading-Version
Programme dann schneller laufen zu lassen,
wird die Wahrscheinlichkeit,
dass man diese Bugs halt dann auch quasi
in echt sieht, die geht halt hoch.
Das heißt, also ja,
ich meine das ernst. Wir werden jetzt wahrscheinlich
zehn Jahre lang Bugs in allen Bibliotheken finden, die
irgendwas mit Threading zu tun haben.
Ja, und es gibt ja auch keine so richtigen
atomaren Operationen in Python.
Oder keine, denen das ansieht,
dass sie atomar sind.
Das macht das Reasoning so ein bisschen
schwierig. Absolut. Und das ist ja auch
einer der großen Schwierigkeiten des
Free-Threading-Projekts.
Dass es sich quasi bei
allen eingebauten Containern, so wie Listen und
Dictionaries und so weiter, jetzt überlegen
müssen, welche der Methoden wollen
wir eigentlich als atomar
verstanden haben und welche
halt dann auch nicht.
Also sowas wie...
Das erkennt man nicht. Ich glaube, das
wird dann dokumentiert.
Ja gut, klar.
Also das muss man nachlesen, aber ja.
Aber die Entwickler, die quasi
Freethreading implementieren, die müssen sich eben bei
jeder Methode dann Gedanken darüber machen.
Also ListAppend ist halt Atomic,
aber ListExtend bin ich mir schon mal nicht mehr so
sicher. Wenn das, was ich dann
als Argument von Xtern reinreiche,
wenn das selber ein Iterator ist und da halt
dann irgendwie mit einem Generator irgendwie Python-Code
ausgeführt wird, dann kann das halt auch eine Weile dauern, bis ich da durch bin.
Und in der Zwischenzeit können natürlich
andere Threads dann laufen und
irgendwelchen Quatsch produzieren.
Ja, und jetzt machen wir uns auf einmal
Gedanken über Transaktionen und über
Transaktionsmanagement und das ist dann schon auf
Sprachebene was sehr Spezifisches.
Um die Frage zu beantworten, was für einen
atomaren Counter ich benutzen kann, da gibt es
irgendwie Iter-Tools
Punkt Counter oder so heißt es, glaube ich.
Und das gilt wirklich als,
also das ist die
Thread-Safe-Variante, um einen
atomaren Counter in Python zu haben.
Also hätte ich jetzt nicht
gewusst. Ich auch nicht,
aber wir hatten halt Bug-Reports, die gesagt haben,
self.x gleich 1 geht halt nicht.
Ja, genau.
Ich erinnere mich noch, das habe ich vor Jahren
mal diese Meinung
vertreten, dass das Global Interpreter
Log mich davor schützt, dass ich
x plus gleich 1 machen kann, so viel ich will.
Und dann haben wir
im Chaosdorf
an einem Abend das einfach mal ausprobiert
und es stellte sich als falsch
raus, die Annahme, weil man eben sehr schnell
falsche Zahlen rauskriegen kann.
Darf ich kurz fragen? Ja.
Das ist selbstverständlich.
Also das komplettes, wie heißt das?
Insider Baseball, also
das hat sich geändert in den letzten
Python-Versionen, also in den letzten
C-Python-Versionen. Du hast absolut recht,
dass quasi, also ursprünglich
war die Regel, ein
Bytecode ist atomar
und aber theoretisch kann ich
nach jedem Bytecode eben
einen Threadswitch haben und
sowas wie das erwähnte
Beispiel, self.x plus gleich 1,
das sind eben mehrere Bytecodes, das heißt, da kann ich dazwischen
einen Threadswitch haben
und entsprechend ist das nicht atomar.
In einer der letzten Versionen,
ich weiß nicht, 3.12
vielleicht oder so, haben sie quasi
in CPython die
Bytecodes, wo man Threadswitch
Thread-Switches machen kann,
also in der regulären GIL-Version,
stark reduziert.
Und es gibt jetzt eben nur noch ganz, ganz
wenige Bytecodes, wo wirklich dann
Switches stattfinden können.
Das sorgt dafür, dass die
quasi beobachtbare
Atomarität zunimmt.
Das heißt, plötzlich in 3.12
war dieses Counter-Beispiel atomar.
Und das ist natürlich total schlecht,
weil, wenn man
die Community darauf vorbereiten will, dass jetzt
irgendwann mal der Gild entfernt wird und
man quasi mit
Thread-Switches an viel mehr Stellen rechnen
muss, ist es halt schlecht,
wenn man in der Version davor
dafür sorgt, dass
viel weniger Thread-Switches an viel
vorhersagbareren Stellen, nämlich nur am Ende von der
Schleife oder sowas stattfinden kann.
Also das finde ich
so, also ich meine klar,
dieses Reduzieren der Thread-Switches,
das erhöht halt wieder die Single-Threading-Performance,
das war der Grund, warum sie das gemacht haben,
Aber ich finde es halt
unstrategisch.
Also ich glaube, wenn du in Teil 12 das mit dem Kauter
nochmal ausprobieren würdest, dann würdest du, das wäre es quasi
nicht mehr beobachtbar.
Dann mache ich das jetzt mal nicht.
Mach lieber gleich in der
No-Gill-Version.
Ja gut, aber damit
müsste es ja gehen.
Damit müsstest du es kaputt kriegen.
Ja, würde ich hoffen. Ja gut,
kaputt kriegen.
Ja, also.
Ich habe jetzt leider keine
No-Gill-Version hier kompiliert, deshalb
muss ich leider... Aber ich glaube, da gibt es auch zum Beispiel so,
also es gibt Packages davon. Ja, ja.
Also bei UV habe ich jetzt gesehen,
gibt es das auf jeden Fall. Ja, bei UV
beißen in Style. Genau. Und in
In...
In Panf weiß ich nicht,
aber in Ubuntu, in dem
Dead Snake PPA gibt's
es auch.
Ja, aber ich meine,
also ehrlich gesagt,
ich weiß nicht, habt ihr jetzt alle schon
einen Anwendungsfall, wo ihr unbedingt das
mal ausprobieren wollt, ob dann nicht alles
viel schneller wird? Weil ehrlich gesagt,
ich hab das
dann nicht so wahnsinnig viele Dinge.
Ja, aber es liegt halt vor allem
auch daran, dass wir daran jetzt gewöhnt sind,
es nicht zu brauchen. Gut, das kann natürlich sein.
Also ich glaube
schon, dass es dann einiges gibt,
wo das halt schon irgendwie auch
klar, man muss dann sich irgendwie
umgewöhnen und vielleicht gibt es auch ein paar schöne
Bibliotheken, die das halt alles ein bisschen weniger
gefährlich machen, dass man so ein paar
schöne Abstraktionen auf den Platz hat.
Aber ich denke
schon, dass wir an einen Punkt kommen können, wo
man dann eben sagen kann,
ja, also früher
hätten wir vielleicht Multiprocessing genommen und es wäre
nervig und
also frickelig gewesen, das dann gut
hinzukriegen und jetzt nehmen wir halt Threads und
es funktioniert gut.
Ja, das ist
halt auch mit Threads programmieren
ist halt auch was
gefährliches. Da gibt es ja, also ich meine,
selbst wenn diese Operationen alle atomar
sind und selbst wenn das so ist, dann gibt es ja immer noch
diese ganzen Probleme
und Deadlocks und Race Conditions
und Cloud-Anzweigs und das
ist einfach eine schwierige Sache.
Ich habe kurz, ich habe eben nachgeguckt, es gibt
in PyEnv gibt es eine 3.13.0
Version und es gibt eine 3.13.0
T-Version.
Und das werden die beiden unterschiedlichen
sein.
Gut, dann muss ich jetzt wo mal installieren.
Genau, und dann muss man ein altes Skript vom Chaos
drauf finden und dann...
Es war
nicht so ein beeindruckendes Testharnes.
Es war einfach nur zwei Threads,
die die Variable gleichzeitig erhöht haben.
Also das kann man relativ leicht
wieder rekonstruieren.
Ja, ich sehe das auch so.
Und ich habe so sehr gemischte Gefühle, was das Free-Threading angeht. Einerseits ist es halt cool, weil endlich diese endlose Diskussion aufhört auf der einen Seite und weil halt auch wirklich jemand mal Geld in die Hand genommen hat und das richtig gut macht.
Also richtig gut, klar, da kann man dann auch Details kritisieren,
aber die Tatsache, dass jetzt eben irgendwie einige Leute von Meta
dafür bezahlt werden, das halt wirklich zu machen
und auch quasi den Aufwand betreiben, das in CPython reinzukriegen,
was ja auch wirklich immer viele Diskussionen
und viel Überzeugungsarbeit und viel Debugging
und sehr, sehr viel Aufwand sind dafür nötig.
Und ich finde es erst mal gut, dass das halt jetzt passiert
und dass quasi auch die Community mitgenommen wird
und irgendwie verschiedene,
also es gibt ja jetzt wirklich auch schon einige an Bibliotheken,
die jetzt mitziehen und gucken,
dass sie halt auch Free-Threading-Versionen
dann Binares auf PyPI releasen und so weiter.
Und das ist schon wirklich gut.
Klar, auf der anderen Seite sehe ich das,
ich denke wirklich, das wird eine Riesenumstellung
und das wird schon auch, was die Bugs angeht
und was die Eingewöhnungszeit angeht
und sowohl in den Bibliotheken als auch in der Sprache selbst.
Ich habe mal einen Vortrag gehört von einem der Sun JVM JIT-Entwickler,
der auch in einem ganzen Laufzeitsystem
und dem Multithreaded Garbage Parallel Garbage Collector
und so gearbeitet hat.
Und der meinte so, im Garbage Collector
findet man halt zehn Jahre lang Multithreading-Bugs.
Und die werden halt immer schwieriger, die zu finden.
und ich weiß halt nicht so genau,
ob wir darauf so richtig
gefasst sind.
Ja gut, hat
ein bisschen Zeit noch populärer zu werden
und dann steigt die Wahrscheinlichkeit, dass man die Bugs findet.
Das ist doch gut. Dann kann man auch schwierige Bugs
finden.
Ist jetzt schon auf dem TIOB-Index ganz oben.
Also ich sehe es so
ein bisschen, hat ein bisschen eine andere Perspektive.
Ich glaube, dass dieses,
die Möglichkeit Multithreading zu machen,
eröffnet eine ganz neue Klasse an
Programmen, die man mit Python
bisher nicht schreiben konnte.
Spiele wolltest du bauen?
Ja, Spiele sind eine, ja, aber
da hast du dann immer noch die Performance-Differenz.
Aber gerade
so verteilte Anwendungen. Das, was
Meta macht, das, was halt die
großen
Anbieter machen.
Wenn man sich mal diese Erlang-Sachen anguckt
aus den 80ern, die einfach
viele Dinge gleichzeitig über einen
Computer laufen lassen müssen, weil es nicht anders
geht, da sieht man diese Klasse von
Anwendungen. Das ist die
eine Seite. Die andere Seite ist halt, dass die
wenigsten von uns diese Klasse von
Anwendungen schreiben.
So ein bisschen aus Henne und Ei
Problem heraus, weil wenn wir
diese Klasse von Anwendungen schreiben müssten,
dann müssten wir zwangsweise
bisher eine andere Sprache als Python
verwendet haben, weil es in Python eben nicht ging.
Und deshalb sind wir Python nicht gew diese Sorte Programme zu schreiben und auch nicht gew diese Sorte Probleme zu l
Und das bedingt sich so ein bisschen selber. Das ist so ein Catch-22. Du kannst es erst lösen, wenn du es gelöst hast und um es zu lösen, musst du es erst gelöst haben.
Also ich glaube wirklich, dass das nicht so super häufig ist. Also ein Fall, den ich halt, ich habe dann irgendwann mal in den Pepp auch geguckt, wo begründet wird, warum will man das eigentlich haben.
und da war zum Beispiel ein Beispiel, was ich dann auch
einleuchtend fand, also es waren ein paar,
aber eins ist mir jetzt noch in Erinnerung,
die anderen nicht mehr.
Da war es halt so, dass da
irgendwie auch im Data Science Umfeld
Firmen gesagt haben, also wir haben ein Problem
und zwar haben wir hier irgendwie dicke Maschinen
mit irgendwie jeder Menge GPUs drin
und jetzt wollen wir die GPUs
mit Bildern füttern oder sonst irgendwas
und klar,
irgendwie I.O. ist nicht so das Problem,
da haben wir kein Problem mit dem GIL,
aber wir müssen die jetzt auch noch
so ein bisschen transformieren. Wir müssen da irgendwie
so ein bisschen das irgendwie mal
so drehen oder manchmal
in Batches organisieren und
keine Ahnung. Und das machen wir halt in Python.
Und wir müssen das schnell genug
machen können, um halt die ganzen GPUs
ständig mit Daten versorgen zu können. Die Dinger sind
sauteuer. Wenn wir da nur die Hälfte
der GPUs verwenden können, dann lohnt sich das alles
nicht mehr. Und jetzt
haben wir ein Problem mit dem Gil, weil
wir kriegen das nicht schnell genug,
wir kriegen die GPUs nicht schnell genug
mit den Daten gefüttert. Und
eigentlich haben wir fast keine Alternative, als
eine andere Programmiersprache zu nehmen, weil
was sollen wir machen? Wir können es
auch nicht auf Prozesse aufteilen oder das geht
auch alles nicht, weil da haben wir das gleiche Problem,
dass halt der Overhead uns
irgendwie, das zu
verteilen halt so
viel Performance wegfrisst, dass wir dann die GPUs wieder
nicht gefüttert kriegen. Also
ja, was sollen wir tun? Und da
dachte ich, okay, das ist wirklich ein Anwendungsfall.
Ja, da braucht man das wahrscheinlich.
Aber ansonsten
Ja genau, aber das ist eben diese
Klasse von Problemen, die ich
meinte vorhin, ja, und früher waren es halt
Telefonverteiler oder
Netzwerkinterfaces oder
keine Ahnung
Damit bist du mit AISING gespannt, ich weiß auch gar nicht, ob
Erlang irgendwie das auch
kann, ich bin mir gar nicht so sicher
also ich glaube, die haben dann ja, also wenn du halt
irgendwie so ein
Parallelismus können, meinst du? Ja, genau
die fahren auch eine Reihe von Prozessen hoch
und haben dann halt eine schlaue Art
irgendwie die miteinander kommunizieren können
Und intern machen die halt,
das kannst du mit Python ganz genauso machen.
Startest du auch mehrere Prozesse und machst
in jedem einzelnen Prozess
dann irgendwie Kuroutinen.
Das kann man,
ist nur nicht so üblich, aber könnte man
wahrscheinlich tun.
Also ich meine, ja, diese...
Async ist ja jetzt auch nicht gerade eine uralte
Entwicklung.
Diese Probleme gibt es ja auch schon lange.
Und Async ist ja auch noch eine Version, das zu lösen.
Auch mit Vor- und Nachteilen, muss man auch sagen.
Ja.
Ja, aber das ist auch…
dafür, wird es stabil genug,
ist die Single-Threading-Performance
akzeptabel schlechter
und ziehen
die ganzen Bibliotheken mit und im Moment
ist das Risiko halt
nicht so hoch. Also das
quasi der absolute Worst-Case, der passieren könnte, ist halt,
wir finden in zwei Jahren raus, niemand benutzt das,
das stürzt die ganze Zeit ab und
Sam Gross hat keine Lust mehr
und dann kann man es halt auch einmal wieder
weglassen.
Also was ich, würde ich
nicht von ausgehen, aber also die Möglichkeit
besteht halt sozusagen.
Ja und wahrscheinlich haben wir, also ich meine,
das hat mich jetzt auch quasi
so eine andere Geschichte, diese ASEM-Geschichte,
es hat eine gewisse Ähnlichkeit
in der Hinsicht, als dass auch das
halt ein tiefgreifender Eingriff war quasi
und sich erst so
über die Zeit entfaltet hat, was das
alles für Probleme bringt und wo es überall reingreift
und so und das ist, bis heute ist das
noch nicht so, sagen wir mal so, da ist immer noch
Potenzial, also es ist schon viel, viel besser geworden,
aber es ist immer noch so, dass da
noch, das ist noch nicht ganz komplett fertig alles
und das hat auch vor zehn Jahren oder so angefangen
und
ja, das hat
ganz schön lange,
ist schon ganz schön lange auf dem Weg und das
wird wahrscheinlich da auch so sein, ja.
Klar, auf jeden Fall, es ist auf jeden Fall ein langfristiges
Projekt, das ist jetzt nichts, was wir jetzt in
in einer Version mal irgendwie so
ein bisschen reinbasteln, dann ist das Problem gelöst.
Also, ja.
Ja, und selbst wenn das alles auf
technischer Ebene einwandfrei funktioniert,
dann ist halt Multithreaded Programming
immer noch einfach auch eine schwierige Sache.
Also die
Dining Philosophers, die kann man
sich gerne mal ansehen und versuchen da eine L zu schreiben das ist nicht so einfach einfach Klar Und ob es dann klappt Mal schauen ob Dominik fragt was das bedeutet
Ich warte nur darauf, dass du es erklärst.
Die Dining Philosophers
sind ein Gedankenexperiment,
wo du fünf
Menschen an einem Tisch sitzen hast und die
wollen Spaghetti essen und zum Spaghetti essen
braucht man zwei Gabeln.
Spaghetti ist Dining.
Ja, okay.
Ja, Teigabeln.
Very fine dining.
Und auch geteilte Gabeln.
Es gibt es nur in den nobelsten Restaurants.
Weil jeder von denen hat nur eine Gabel.
Also bei jedem Teller liegt eine,
zwischen zwei Tellern liegt immer eine Gabel.
Also ein Philosoph hat eine Gabel rechts von links
und eine links von sich.
Aber auf diese Gabel haben immer zwei Menschen Zugriff.
Und jetzt wollen die alle Spaghetti essen
und brauchen dafür zwei Gabeln.
offensichtlich können die nicht alle gleichzeitig
Spaghetti essen.
Weil es gibt nur fünf Gabeln, wenn jeder
zwei Gabeln braucht,
bräuchten sie zehn Gabeln. Es ist also
so ein Ressourcenproblem. Das viel
schlimmere Problem ist aber,
dass man da ganz einfach
diese ganzen Probleme
visualisieren kann,
die auftreten können, selbst wenn
dieses System auf einer technischen Ebene
einwandfrei funktioniert.
Du meinst zum Beispiel, die haben alle eine große Schüssel Spaghetti
und die haben gleichzeitig zwei Enden einer langen Spaghetti im Mund.
Das ist das Disney, die Disney-Variante.
Nee, die meine ich jetzt hier an der Stelle nicht, aber ja.
Zum Beispiel, wenn man ganz naiv sagt,
wenn ein Philosoph Spaghetti essen möchte,
dann greift er zuerst mit seiner rechten Hand nach einer Gabel
und dann mit der linken Hand nach einer Gabel.
Und wenn da eine Gabel nicht liegt,
dann wartet er halt in dem Zustand, in dem er gerade ist,
bis die Gabeln verfügt.
Also sitzen da irgendwelche Leute, die haben alle eine Gabel in der Hand
und warten darauf, dass sie eine zweite bekommen.
Genau, also im schlimmsten Fall greift jeder nach der rechten Gabel und wartet dann auf die linke Gabel, die aber durch den Philosoph zu seiner Linken schon belegt ist.
Und die warten dann alle aufeinander und müssen für immer an diesem Tisch sitzen und verhungern, vor dem vollen Teller.
Dreadlock quasi.
Und das ist ja eine extrem simple Situation, das ist ja eine extrem vereinfachte Sichtweise.
Du meinst, du musst mit deiner Idee und sagst, gib mir mal eine Gabel, bitte.
Ja, aber tatsächlich Threads,
die kommunizieren, sind ja auch was extrem
schwieriges, insbesondere wenn die gerade auf
einen Lock warten, weil üblicherweise,
wenn so ein Thread auf einen Lock wartet, kann er ja derweil nichts anderes machen.
Das ist dann blöd.
Hat den Mund schon voll. Genau, das ist blöd.
Und jetzt muss man eben anfangen,
wie kriegt man das in den Griff?
Wie kann man das im Allgemeinen
lösen, dass die keine Deadlocks machen?
Mehr Karten verteilen?
Ja, das wäre eine Möglichkeit, aber normalerweise ist das
schwierig. Also zum Beispiel in dem Modell
von Jochen einfach mehr GPUs einbauen.
Ist prinzipiell eine Lösung.
Ist nicht ganz billig.
Und es sind halt goldene Gabeln.
Mehr Gabeln geht nicht.
Ja, es ist einfach ein
Gedankenmodell, um nachzuweisen,
dass auf dieser ganz simplen Ebene
schon Probleme auftreten, die ungeheuer schwierig
zu lösen sind und ungeheuer schwierig
in ihrer Allgemeinheit zu lösen sind.
Und wenn du sagst, okay, dann habe ich eine Lösung gefunden
für fünf, was ist, wenn du da sechs Philosophen
sitzen hast oder tausend oder
nur zwei?
die deine Lösung dann immer macht.
Also schon allein die Tatsache, dass quasi
einer der schwierigsten Probleme bei verteilten
Systemen ein Counter ist,
das ist ja eigentlich auch schon
relativ lustig.
Eine Zahl hochzählen.
Genau, eine Zahl hochzählen.
Also global, konsistent und so, das ist wirklich
auch, schon das ist nicht so einfach.
Ja, kennt ihr das, wenn irgendwie an so einem Festival-Eingang
irgendwer stehen muss mit so einem Klicker,
wenn man draufdrückt, muss jemand reinrennen oder wenn man
an der anderen Hand jemanden rausrennt?
also ich bin ja auch so sicher, der verdrückt sich die ganze Zeit
irgendwann mal und weiß gar nicht so genau, wie viele
Leute sind eigentlich auf dem Gelände, sondern ich weiß wahrscheinlich relativ
ähnliches Problem. Wenn es so 18 Eingänge sind und dann
dann finden die dann raus, jetzt sind
gerade minus 10 Leute bei uns auf dem Festival.
Das ist doch der klassische
mathematische Mengenlehre, wenn
drei Leute reingehen und fünf rausgehen,
müssen zwei wieder reingehen, damit es leer ist.
Und der Kirchturm ist minus 30 Meter hoch.
Ja, okay, also Threading ist
ist eine Riesensache. Man kann es ja mal positiv
ausdrücken. Die Hoffnung ist, dass es jetzt eben ganz, ganz
tolle Abstraktionen geben wird, die dann
auf der quasi
Low-Level-Basis von
Threads und Logs und was weiß ich,
was es dann eben an Infrastruktur gibt
oder geben wird,
die das unwahrscheinlicher machen, dass wir Deadlogs
produzieren. Das ist die positive Sicht.
Das wäre sehr schön.
Und das kriegen wir bestimmt hin,
weil die Python-Community ist großartig und
die zeigt immer wieder, was sie für geniale
Lösungen findet.
war das jetzt, da kannst du schon nicht
hören.
Die Zeit wird es zeigen.
Genau,
das möchte ich in der Folge
600 besprechen.
Nee, es ist schon so,
also ich bin immer wieder
überrascht. Ich meine, wir haben ja hier in dieser
Runde immer wieder den Pick, wo wir
auf Sachen zeigen die in der Python passieren oder auch au die einfach geniale Dinge sind die keiner wusste Ich mache auch gelegentlich Python f Anf und eine Sache die wir da machen
ist einfach mal durch die Standardbibliothek
scrollen und gucken, was
es da so alles gibt und da findet man immer
Sachen, die spannend sind
und neu und interessant und
ich finde, das gehört schon auch irgendwie
so ein bisschen zur Python-Welt dazu, dass es
immer mehr Dinge gibt und immer viele
schöne neue Sachen und neue Bibliotheken,
die Dinge tun, von denen man noch nicht mal wusste, dass man sie
gebraucht hat bisher.
Du wolltest gerade picken, hast du damit gesagt schon?
Noch nicht, vor allem
ich habe diese Woche oder dieses Mal
gar keinen Python-Pick dabei, aber das macht ja nichts.
Kein Python. Es ist einfach nur ein Hinweis
darauf, dass es viele tolle Dinge gibt, die man nicht
kennt. Ja, und wenn man jetzt von der
Schnabel-Bibliothek weggeht und sich mal die Top 100
PyPI anschaut oder so, dann wird es dann nochmal irgendwie
also so die Bandbreite,
was für verschiedene Themen es so gibt,
ist schon immer wieder sehr beeindruckend.
Ja, aber das ist
versehentlich total gute Überleitung, weil
in der 3.13 wurden ja auch Sachen entfernt.
Das Python.
Und die Liste ist gar nicht so klein.
Das ist übrigens auch da
wieder so ein bisschen Geschichte.
Das ist ein
gefühlt jahrzehntelanges Projekt.
So ein paar von diesen Sachen.
Das wurde mal auf einem
C-Python-Core-Developer
Treffen in einem Vortrag empfohlen,
der damals mit sehr
gemischten Reaktionen aufgenommen wurde
und
es hat ewig gedauert, bis
das jetzt wirklich passiert ist, dass der Bibliotheken jetzt
entfernt wurden.
Die Motivation ist, dass es halt
quasi so ein bisschen Code in der Standardbibliothek
gab, der einfach
sehr veraltet ist
und nicht mehr so richtig
für aktuelle Probleme zu benutzen
ist und die wurden dann eben
zuerst deprecated und jetzt
seit ein paar Personen und jetzt eben wirklich
wurden ein paar entfernt.
Ja, wir können die Liste einfach mal, ich habe die
Liste zufällig vor mir.
Rein zufällig.
Diese Anstrengung heißt
Removing Dead Batteries
und
die entfernt folgende Module.
AIFC, AudioOp, Chunk, CGI,
CGI-TP, Crypt,
Image Header, Mail Cap,
MSI-Lib, NIS,
NETP-Lib, OSS-Audio-Dev,
Pipes, Soundheader,
SPWD, SunAU,
Telnet-Lib, UU, XDR-Lib und
Libs 2-3.
Und ich weiß,
weil euer Paket auf einmal weg ist,
solltet ihr auffassen mit dem Update.
Genau, also wenn da jetzt was dabei war, was ihr gerne haben wollt.
Ich glaube, die landen an der Pipe-Eye.
Ja, ja, die gibt es doch.
Was Z-Python ja nur erreichen will, ist,
dass sie die nicht mehr maintainen.
Nicht, dass die jetzt verboten sind
und auf gar keinen Fall mehr von irgendjemandem verboten.
Ja klar, es geht nur darum,
dass man die nicht die ganze Zeit mitschleifen muss,
weil das ist ja auch Aufwand,
die in der neuen Version mitzunehmen.
Aber also bei einem Großteil dieser Bibliotheken
weiß ich nicht, was die tun.
Ja, man kann so ein bisschen raten,
aber bei ein paar kann man nicht mal raten.
Ja, bei manchen, ja, was, keine Ahnung, NNTP-Lib macht,
okay gut, das ist NNTP.
Was CGI macht, weiß ich auch noch, weil wir alt sind.
Ja gut, da sind wir.
Aber wüsstest du jetzt den Unterschied zwischen CGI und CGI-TP?
Ich glaube, das eine ist der Trace-Bank.
Ja, aber ...
Turbo.
SunAU ist so ein altes Audio-Format, oder?
Ja, ich glaube auch.
Oh, MSI-Lib für Microsoft-Installer-Dateien.
Auch großartig.
Kennt ihr die meist untergeladene Datei auf PyPI?
Irgendwas mit Setup-Tools?
Ich weiß nicht.
Okay.
Keine Ahnung.
Also auf jeden Fall das Richtige, die diese Sachen
sind. Also es gibt so eine Liste,
die sagt Boto 3.
Ah, oh, das liegt, ach ja, das ist klar,
das liegt in den Updaten irgendwie alle zwei Stunden.
Und da das
halt irgendwie eines der Hauptdinger ist,
dass du halt brauchst, wenn du
irgendwas mit irgendwie
AWS oder so machst.
Mhm.
Die drittbestes Boto Core.
Ja, ja, das ist alles so.
Und Platz 2? Ja, weißt du, das ist nicht der Grund,
warum Pipe.ai keine Statistiken mehr anzeigt.
Naja.
Da könnte man jetzt denken, das wäre irgendwie wichtig,
aber das ist halt überhaupt gar nicht so.
Warum zeigen die keine Statistiken mehr an?
Weil die nicht trennen können,
ob das jetzt ein Mirror ist oder ein automatisches
Update oder jemand, der die Bibliothek tatsächlich
in einem Projekt installieren möchte und deshalb
sind diese Zahlen völlig verriegelt.
Du willst sagen, weil Counter halt zu schwierig sind.
Ja, genau.
Und nicht nur in der Benutzung,
sondern auch in der Interpretation.
Ja, ich meine,
die Zahl der Downloads ist auch irgendwie so ein bisschen
weird.
1,5 Milliarden.
Die Zahl, die da rauskommt, ist halt, wie oft
das geupdatet wird, ist auf jeden Fall ein Faktor,
mit dem da multipliziert wird und
ja, ich meine, aber das ist ja
jetzt nicht...
eine gute Sache, wenn da irgendwie alle
paar Minuten Pakete irgendwie
die Version hochzählt.
Aber wenn das dann irgendwie in den
Continuous
Integration Pipelines verwendet wird,
dann wird das halt gnadenlos neu runtergeladen,
wenn sich da irgendwas ändert.
Also, ja, naja.
Ja, wahrscheinlich braucht man irgendein anderes
Metric KPI
für irgendwie, ist das
jetzt irgendwie interessant oder nicht? Aber ich weiß auch nicht, welche.
Github-Sterne.
auch schwierig.
Metriken, KPIs.
Ja.
Es wurde schon mal in einem Podcast erwähnt.
Vielleicht sollten wir da
sowas auch so ein
Quartettserie von machen.
Ja, von den
PIPI-Bibliotheken.
Ja, genau, hast du ein Quartett mit vier
die besten PIPI-Bibliotheken oder irgendwas mit den KPIs
und dann kannst du die ganzen Module da reinbauen
und dann kannst du dich gegeneinander,
könnt ihr das?
Also meins hat 1,5 Milliarden Downloads.
Aha, 798 Megabyte.
Mehr Kilowattgröße, genau.
Und Anzahl der Releases wäre doch auch ein gutes.
Ja.
Offene Issues.
Ist das besser, wenn es höher ist?
Tja, genau.
Aber um auf die Dead Batteries zurückzukommen,
ich verstehe es auch, dass es gut ist,
wenn die entfernt werden.
Ja, absolut.
Ja.
Aber es wird da sicherlich die Leute geben, die
sagen, nein, wie soll ich
sonst je meine
Detailnet verwenden?
Ja, aber die hätten
ja jetzt auch schon eine ganze Zeit lang Zeit
da was, und ich glaube auch nicht,
da ist auch nichts
sonst passiert.
Ja, ich weiß nicht, haben wir
vielleicht nur so kleinere Dinge, oder ich weiß es nicht genau,
gab es noch irgendwas Interessantes?
Typing.
Ja, Typing, ja.
Typing, Simple Namespace, wolltest du sagen?
Das kannte ich noch gar nicht.
Ich weiß gar nicht, welche Version das war.
Ja, du kannst es auch nicht.
Okay. Ja, ich kann es auch nicht.
Simple Namespace ist ein Dikt,
dass man wie Attribute dann
die Keys benutzen kann.
So ein bisschen so ein Name-Tuppe.
Und da hat CF gesagt,
oh, das ist aber ganz schwierig, weil
da ständig irgendwas kaputt geht und hat dann
auch Enum in den Raum geworfen. Das würde ich
gerne nochmal kurz hören und verstehen,
warum das so blöd ist.
Ich habe doch schon gesagt, dass ich das zensieren will.
Nee, wir haben so ein bisschen darüber geredet,
welche Standard-Bibliotheks-Module uns als Piper-Entwicklern
irgendwie besonders oft Probleme bereiten.
Und Inam ist da immer mal wieder so ein, wie heißt es?
Eine eierliegende Wollmichsau.
Ein Problembär.
Also Inam benutzt einfach ganz, ganz viele Tricks
des Python-Datenmodells und Metaklassen
und irgendwie schafft es immer wieder Randfälle,
zu erwischen, die wir dann doch nicht so ganz korrekt
implementiert haben und da müssen wir erstmal,
wenn wir, was ich,
zu einer neuen CPython-Version die Standard-Bibliothek
dann übernehmen,
müssen wir erstmal irgendwelche Python
Datenmodell-Core-Features
fixen, bevor ihr ihn halt auch nur importiert
oder so. Genau.
Und NameTuple ist da auch ein Problem. Nicht so richtig,
weil das
irgendwie Bugs hat, sondern weil das oft
Performance-Bugs hat.
Der Tuple langsam, das war mir auch neu.
Ja, NameTuple benutzt halt quasi, wenn man so einen neuen NameTuple-Typ anlegt, da wird halt auch mit exec dann irgendwie so mit Strings irgendwelche Python-Code generiert und das mag der JIT halt nicht.
Weil der JIT, der geht halt davon aus, dass ich die gleichen Funktionen oft aufrufe und nicht ganz, ganz viele neue Funktionen ständig mache, die dann eben neu zum Maschinencode übersetzt werden müssen.
Und das sorgt eben dafür, dass bei NameTuple die Performance oft wirklich sehr, sehr schlecht war in PyPy.
und inzwischen ist das gefixt, aber so
über so ein paar Versionen hatten wir mit
Name-Toppel immer mal wieder Probleme. Mit Data-Classes
am Anfang übrigens auch, aber es ist inzwischen auch, glaube ich,
ganz gut repariert.
Aber das sind auf jeden Fall
so ein paar, also es gibt Bibliotheken,
die wir einfach eins zu eins übernehmen können,
gerade wenn die in Python geschrieben sind, ist überhaupt kein Problem
und es gibt welche, wo wir halt dann eben
sehr, sehr viele PyPy-spezifische Patches haben
und Name-Toppel
ist definitiv eins von denen, wo es
eher mehr als weniger Patches gibt.
Das habe ich jetzt geschafft, ohne jemanden zu beleidigen.
Oh.
Genau.
Ja, Typing waren auch noch so ein paar
Dinge.
Ich bin ja nicht so der Typing-User.
Die Features sind schon
viel zu advanced für mich.
Ja.
Ups.
Ja, aber ich weiß nicht.
Da war jetzt auch
Read-Only.
Ja, okay.
Hast du das gerade vor dir Ja die Beschreibung ist sehr kurz aber es geht wohl darum dass man Locals bearbeiten kann
Und das war bisher nicht so genau definiert, was da passiert.
Und jetzt kann man das machen.
Also vor allem.
Ist wohl für die Bagger wichtig. Hier steht, ist für die Bagger wichtig.
Ich glaube, der Trick ist, also das Wichtige daran ist wirklich, dass jetzt einfach mal genau aufgeschrieben wurde,
was genau passiert, wenn man Locals aufruft.
Was können sie erwarten?
Was können sie erwarten? Und manchmal ist es eben so, dass das Dictionary, was Locals, also bei Globals ist ja so, das Dictionary, wenn ich da Keys reinschreibe, dann, das ist wirklich das richtige Globals-Dictionary. Und wenn ich danach das entsprechende Global nachschaue, dann sehe ich auch die Änderung. Und bei Locals hängt eben…
Und das macht sehr schöne Tricks.
Ja, macht sehr schöne Tricks möglich. Bei Locals ist das nicht so. Bei Locals war es eben manchmal so, dass wenn ich Locals verändere, dass sich dann die Locals wirklich ändern und manchmal eben halt auch nicht. Und genau in welchen Fällen welche Variante dann galt, das war immer ein bisschen schwierig vorherzusehen und verschiedene Python-Implementierungen haben das auch verschieden dann angegangen.
Also quasi zwischen Funktionen, Global Scopes, Generatoren, Core Routinen, Comprehensions, Class Scope, also es gibt da schon so einiges. Achso, Code, der von Exec oder Eval ausgeführt wird, da gab es eben schon so einiges an Fällen, wo es halt dann so immer so leicht unterschiedliches Verhalten gab.
Das wurde jetzt eben fest definiert und ich glaube, es ist so, dass Locals weniger oft, also dass man Mutationen bei Locals weniger oft zu Veränderungen in den echten Locals führen.
Aber auf der anderen Seite ist es eben so, dass in den Debuggern, wenn man da sich so ein Frame-Objekt geben lässt und da das Attribut F-Locals mutiert, dass das eben zu vorhersagbaren Veränderungen an den echten Werten der Locals führt.
Und das im Debugger ist eben wichtig, wenn ich im Debugger dann sagen möchte, ich führe jetzt die Funktion aus und die lokale Variable A hat den Wert 17. Ich will jetzt aber einfach mal im Debugger, um rauszufinden, was da genau passiert, das auf 19 setzen. Und wenn das dann nicht geht, weil eben das Verändern der Locals im Debugger nicht so richtig implementiert ist oder nicht immer geht oder nicht in Generatoren geht, ist das halt so ein bisschen frustrierend. Und da ist es eben gut, wenn man jetzt ein klar definiertes Verhalten hat, auf das man sich verlassen kann.
Ja, und
die vielen Debugger-Autoren unter unseren
Zuhörern haben sich gerade eben sehr gefreut.
Naja, also
die Debugger-Autoren sind die einen,
aber die
Leute, die Debugger dann
benutzen, zu denen gehören
wir ja dann doch meistens.
Leider auch.
Print-Debugging.
Wir alle, die noch nicht sofort beim ersten Mal
perfekten Code schreiben können.
Print-Debugging, mehr braucht kein Mensch.
Kennt ihr diese
das kann ich auch noch nicht, aber ich fand diese
Analogie sehr schön.
Ich glaube auch aus der letzten
Copy-by-Episode, wo man meinte,
da gab es wohl irgendeinen Vortrag
vor langer Zeit,
wo jemand gesagt hat, na, also sei kein
Bond-Villain
beim Debuggen, zum Beispiel.
Also Bond-Villain
Die machen aber
alle irgendwie blöde Fehler,
dass sie zum Beispiel irgendwie ständig erklären,
was ihr Plan ist oder dass sie halt
nicht irgendwie mit der
großen Weltraumlaser-Kanone schießen,
sondern mit einer kleinen Pistole
irgendwie sich eine Schießerei mit
Bond liefern und das ist halt eine dumme Idee, weil da ist
halt einfach was besser drin und
man hätte lieber den Weltraumlaser nehmen sollen
und die Idee ist sozusagen,
wenn du debugst, nimm den Weltraumlaser direkt,
fang nicht irgendwie an mit Printf mit der blöden
kleinen Pistole, sondern
nimm das mächtigste Tool, was du irgendwie
hast, weil das ist doch Zeitverschwendung, wenn du irgendwie
zuerst mit Printf anfängst, nimmst du das nächste,
das geht auch nicht, dann nimmst du das nächste.
Wir fangen lieber gleich mit dem großen Ding an.
Den großen Hammer nehmen und draufhauen.
Aber du kannst nicht dein
Brot schneiden mit dem Weltraumlaser.
Ja, aber
die Idee fand ich
schon, ja, hatte was.
Aber da gibt's auch
einfach sehr, das ist einfach sehr individuell.
Ich kenne auch Leute, die leben nur im Debugger.
Da ist halt
einfach der erste Schritt, ich mach
eine Funktion, die ist leer und
werden die Argumente reingereicht
und dann mache ich erstmal einen Debugger an.
Gucke halt, was für Argumente sind das jetzt hier
und wie müsste denn der Code aussehen?
Dann schreibe ich zwei Zeilen mehr und mache wieder einen Debugger rein.
Ja, also in manchen Sprachen ist das ja auch noch viel mehr so,
dass man das dann auch, dass die IDE das auch unterstützt
und man dann quasi die Funktion restarten kann
an der Stelle, wo man halt gerade war.
Dann schreibt man ein bisschen mehr Code, restartet die wieder.
Also die Smarter-Leute machen das besonders gern,
die es noch gibt.
aber ja, also
ich kenne auf jeden Fall auch in Python Leute, die halt
sich das so angewöhnt haben, dass sie halt
im Test schreiben, die Bagger anmachen
und dann kann man halt erstmal so gucken was hat man denn eigentlich f Objekte was haben die f Methoden und wie ja was macht man denn da eigentlich NB so ein bisschen so Ich habe auch versucht mal einen
zu überzeugen von
Jupyter-Notebooks und so, aber ich begeisterte von der Zelle.
Ja, nee, benutze ich nie, finde ich blöd.
Und dann habe ich gesehen, wie der entwickelt
und der tatsächlich hat quasi
das, was ich in Jupyter-Notebooks mache, macht der im Debugger.
Ja.
Das kann man gut tun,
das geht schon, aber es ist halt
okay, ja.
Wenn man jetzt noch einen Debugger hätte, der vorwärts und
rückwärts steppen kann und wo man zwischendurch
den Code verarbeiten kann.
Aber ich glaube, PDB ist eine der Sachen, wo ich
das Gefühl habe, dass das auch
so ein bisschen revitalisiert
ist. Also dass es da jetzt
Coders gibt, die sich dafür interessieren und eben hoffen,
da in den nächsten Versionen auch ein paar
neue Features reinzukriegen.
Ich glaube auch in 3.13 ist schon die erste Version.
Zum Beispiel, dass
wenn man so einen Breakpoint macht, dass dann
dass man dann
nicht erst in der nächsten Zeile
dann wirklich anhält im Debugger
sondern schon in der Zeile selber wo der Breakpoint ist
Ah ja genau genau
da war auch irgendwie so eine Seltsamkeit
dass wenn man das vor einem Return gemacht hat
dass man dann halt irgendwie
im Caller erst den Breakpoint gekriegt hat
Ja also
das sind schon einige Dinge hier
Um jetzt meinen
Einwurf noch
kurz zu retten
das war eine Präsentation
von einem Spieleentwickler, die sich selber so ein System
gebaut haben. Jochen, du hattest die glaube ich.
Die Tomorrow Corporation.
Die haben sich genau so
einen Debugger gebaut, der vorwärts
und rückwärts steppen kann und wo ich
zwischendurch Code verändern kann und dann trotzdem
die Auswirkungen alle sehe. Und das war schon
sehr beeindruckend, weil das halt
tatsächlich so ein Debugging
ermöglicht, am offenen Herzen ohne Angst
haben zu müssen, dass der Patient jetzt abstürzt.
Das ist schon sehr beeindruckend.
Ja, und es war auch noch irgendwie da, dass es ein Spiel ist.
Man hat halt unten quasi beim
Liebherr so einen Schieber
und das Spiel geht halt mit.
Und man schiebt den so da und das Spiel läuft rückwärts
und
sagt dann so ganz trocken so zu,
ja, das sind jetzt nicht irgendwie Screenshots oder so.
Nee, das ist das echte Spiel, was wirklich irgendwie neu
gerendert wird.
Dann schiebe ich hier mal die Funktion ein kleines bisschen um und lasse das mal
wieder laufen von hier aus.
Und jetzt ist auch dieser Branch.
Ich wünsche mal bitte diesen Vortrag.
Ja, kann ich auch in den Show Notes mal verlinken.
Ja, dann füge ich auch in die Show Notes rein.
Aber das, also ich hatte,
ich glaube, die Free-Threading-Leute,
die müssen solche Tools auch benutzen,
weil es ansonsten einfach echt zu schwierig ist.
Und da gibt es halt auch für C so
Back-in-Time-Debugger, der, wie heißt
der nochmal?
Anfang des Jahres war ich zum ersten Mal in der Situation,
dass ich mich genötigt gesehen habe, auch so einen zu
benutzen, weil wir so einen nur
sehr selten stattfindenden
Garbage-Corrector-Bug hatten und
mit so einem Back-in-Time-Debugger
kann man halt dann
solche Probleme auch richtig gut lösen.
Also das ist quasi so ein
Tracing-Debugger, der macht so eine Aufzeichnung
der gesamten Prozessausführung.
Das kann man einfach hundertmal machen, bis der Crash
stattfindet und dann kann man sich die
Ausführung beliebig oft wieder anschauen.
Und das Interface ist quasi
so wie so ein normaler Debugger. Ich kann halt
Next machen und Sachen printen,
aber der Prozess wird nicht wirklich neu ausgeführt,
sondern das ist quasi
nur ein Replay von
dem, was eben bei der crashenden
Ausführungen wirklich passiert ist.
Und da kann ich
dann wirklich auch ein Backward Next
machen und dann bin ich wieder eine Zeile davor.
Oder ein Backward Finish
und dann bin ich eben am Anfang
der Funktion nicht gerade ausführend.
Oder halt auch so Sachen wie, ich mach
ein Hardware Watchpoint, also
das war wirklich
Memory Corruption, die ich da debugged hab.
Und wenn du halt dann
einen kaputten Speicher hast, dann kannst du dir so ein
Watchpoint setzen, wo du
sagst, wer hat diesen, also
wenn dieser Speicher
verändert wird, dann halt an.
Und dann
kann man quasi vom Crash sagen,
man macht so einen Watchpoint für den kaputten Speicher
und dann lässt man rückwärts laufen.
Weil dann findet man quasi, wenn man rückwärts
läuft, findet man den Code, der den Speicher
wirklich kaputt geschrieben hat.
Und das war wirklich richtig
gut.
Das war ziemlich magisch.
Es ist sehr magisch. Es funktioniert übrigens auch nicht,
also technisch ist das nicht so implementiert, dass es wirklich rückwärts läuft.
Weil es ist ja Maschinencode,
das geht für beliebigen Code.
Stattdessen macht er nur Snapshots.
Der geht dann zum letzten Snapshot
und läuft von da vorwärts.
Aber es fühlt sich halt trotzdem so an.
Ja, gut genug.
Okay, okay, ich habe hier noch den wichtigsten,
ich habe hier noch den wichtigsten,
die wichtigste Änderung in Python 3.13.
Bei Dockstrings werden jetzt
die führenden Leerzeichen entfernt.
Oh ja, das ist ja auch was von,
die Linde. Das hatten wir schon uns angeguckt
im Rappel tatsächlich.
Warum? Wofür ist das da?
Wie viel Prozent
des Codes ist weniger?
Oder der Byte F Prozent F Prozent weniger Aber also einfach weil es korrekt ist oder Man braucht niemals den
Dockstring mit der Einrückung.
Naja, 5% finde ich ganz schön krass.
Also 5% sind Leerzeichen von
angerückten Dockstrings in unseren
PYC-Dateien. Das ist irgendwie,
würde man jetzt erstmal
so nicht erwarten.
Green Development danach.
das liegt halt daran, dass wir alle so viele
gute und ausführliche Dockstrings
schreiben und ganz viel...
Vor allen Dingen aus Letztdechem bestehen.
Ja, ich weiß nicht.
Ich auch einen Schreibkern.
Na ja, gut, wenn ich einen Klassen habe,
haben wir es. Methoden-Dockstrings,
dann sind die ja schon immer 8
Bytes eingerückt pro Zeile
Dockstring. Ja, richtig.
Und das
müsste ja eigentlich 10% sein, weil wir gehen ja
nur bis 80 Zeichen pro Zeile.
Ist das nicht 79?
Ja, streng genommen ist es 79.
Ja, oder so, okay.
79, 79.
Was habt ihr denn für moderne Displays?
80 mal 25, oder?
Wenn du Python Modus 4 auf deinem T64 schreibst, oder?
Es gibt Leute, die müssen auf ihrem Handy entwickeln.
Ich habe Python auf meinem Handy.
Das ist keine Supporte der Sponsor.
Okay, wie geht das denn?
Ja, in
PyPy ist tatsächlich ein Paket auf
Thermux.
PyPy hat eine ARM-Version und dann
kann man
das einfach laufen lassen. Manchmal ist es auch nett,
dann kann ich in der Bahn irgendwie,
ist halt so ein bisschen nervig zu tippen, aber
man kann auch den JIT laufen lassen, man kann sich dann auch
auf dem Handy anzeigen
lassen, welchen Maschinencode
der PyPy-JIT jetzt gerade auf
für den Python-Code, den man auf dem Handy
laufen ließ,
erzeugt wurde.
wenn man die richtigen Umgebungsvariablen weiß.
Aber Thermux kann das leider noch nicht, dass man mit dem Daumen
hoch und runter machen kann mit dem interaktiven
Neuen. Nein, nein, aber das ist Scrolling
und ich meine jetzt durch die einzelnen Zeilen durch
vom Editor, vom
History Edit. Ich glaube, achso,
du meinst so in der Konsole?
Ja, ja, ja. Schade.
Habe ich, also jedenfalls mit dem Thermux habe ich auch
eine,
weiß nicht, wie lustig die für andere ist. Ich fand die lustig,
ist mir was auf einer Konferenz im Sommer passiert.
Ich war auf so einer akademischen
Programmiersprachenkonferenz mit
Forschern und Forscherinnen, die sich
mit Compilern und
Optimierung und Programmiersprachen und so auseinandersetzen.
Und da war ich dann mit
einem relativ bekannten
C-Compiler-Prof,
John Regge, heißt der,
auf so einem Boot in Kopenhagen Bier trinken.
Also das Boot lag
am Hafen, man konnte auf Deck Bier trinken.
Hab die dann eben auf dem Handy
so eine Optimierung gezeigt, die wir in PyPy machen.
Und er hat also mit PyPy
noch nie irgendwas zu tun gehabt und schaut sich das an
so in ganz, ganz kleinem Font und
meinte so, warum ist denn da diese Extra-Operation?
Die braucht er doch gar nicht. Und
das war absolut richtig und
der Grund war, dass
die Divisionen in C und in Python halt
sich unterschiedlich verhalten,
wenn die
Zahlen negativ sind. Und dafür
braucht man halt in Python so ein
Extra-Xor, aber die Tatsache, dass
er das quasi so mit dem
8-Punkt-Font
über ein Bier, so auf
dem Handy mal eben so gesehen hat,
quasi in einem
ASCII-Format, was er noch nie gesehen hatte, das fand ich dann
doch relativ krass.
Ich würde sogar fast sagen, das ist fast
der Schluss von Thema 13.
Ja, ich glaube, wir sind mit dem Thema eigentlich mehr oder weniger
durch. Dann
können wir eigentlich nochmal zu einem
welchen Teil
wechseln. Wir konnten
zum Beispiel
ein bisschen
Metageschichten machen.
Metageschichten, das sind Metageschichten.
Ja, zum Beispiel hatten wir
Anfragen nach
Ach, das ist also eine Zanzimetallgeschichte.
Ja, also, wie sieht das
eigentlich aus? Wollt ihr nicht mal
ein Hörertreffen machen?
Ja, wollen wir das?
Und genau, das hängt, würde ich
meinen, davon ab, ob
es Hörer gibt, die das auch
gerne machen wollen würden, weil
ansonsten
sitzen wir da alleine rum irgendwo.
Das wäre ja auch irgendwie...
Jetzt können wir das natürlich auch machen.
Aber
sagen wir mal so, man kann
einfach eine Mail an
hallo.verein.podcast.de schreiben zum Beispiel
und wenn da jetzt fünf Mails kommen,
dass man sich irgendwo
Köln, Düsseldorfer Raum oder so
treffen wollen würde, dann
machen wir das einfach mal.
Und genau,
das ist eine Geschichte.
Dann gab es eine Nachfrage nach...
Ich würde das gerne noch
erweitern, also falls da fünf Mails
kommen, die sich im Stuttgarter Raum
Genau, dann, oh, oh,
vielleicht müssen wir uns in der Mitte treffen, irgendwo in
Frankfurt oder so, oh.
Ja, ja, gut.
Ja, in Frankfurt, nee.
Das ist bimodal, oder? Das ist Düsseldorf
oder Stuttgart und dann
kriegt man das hin.
Da, wo sich mehr melden,
da müssen wir dann hin.
Da ist zuerst.
Okay, mal schauen.
Ich bin mal gespannt, ob sich da jemand meldet.
Das könnten wir machen.
Genau.
Dann soll man T-Shirts machen.
T-Shirts.
Ja.
Ja,
könnten wir auch machen.
Hat sich da gerade jemand
freiwillig gemacht?
Müssen wir mal schauen.
Genau, eine andere Anfrage war
von jemandem, der irgendwie alte
Episoden durchhört, dass wir wohl irgendwann mal gesagt
haben, oh, wir machen mal einen Discord-Server oder so.
Und dann
kam die Frage, haben wir das denn mal gemacht dann?
Ja. Und die Antwort ist ja.
Aber wir haben nie drüber geredet
und vielleicht machen wir das jetzt auch mal
und packen einen Link zu dem Discord-Server
einfach irgendwie auch in die Shownotes
oder so. Und da kann man
auch einfach dann mal drauf gucken, weil
tatsächlich haben wir das und
ja, wir haben das
aber nie kommuniziert, dass wir das haben. Daher
ist da auch
wenig los. Genau.
Und wie ist
eigentlich mit den tollen
Transkripten von unserem Podcast,
lieber Jörg? Ja, da habe ich jetzt
am Wochenende gab es den
Pi-DDF-Herbstsprint und
da habe ich angefangen, mich mal
damit zu beschäftigen, weil
ich dachte so, also ich meine, klar, dass man da
kann man nicht, also in zwei Tagen
kriege ich das nicht hin, aber
ich habe zumindest angefangen und man
kann jetzt auch, wenn man im Webplayer
auf, da ist so ein
zusätzlicher Button bei den Episoden, wo es
Transkripte gibt.
Also falls ihr Taubseiten uns trotzdem hören wollt, könnt ihr uns
jetzt auch also lesen. Ja, genau.
Das sieht aus wie so ein
Dokument-Icon, wenn man da
drauf drückt, dann
erscheint da irgendwie
so ein Transkript-Tab drunter.
Und das läuft auch mit,
wenn man dann mit dem Player das
abspielt. Und das geht schon.
Aber das ist nur ein Teil von den Sachen, die man implementieren muss,
wenn man Transkripte haben will. Da kommen noch
diverse andere Geschichten dazu, mit denen ich noch nicht fertig bin.
Aber das geht auf jeden Fall.
Dabei ist mir dann auch eine Geschichte
aufgefallen, die halt blöd ist.
Ich dachte, das ist voll super, wir haben ja auch die Spuren
noch. Das heißt, die
Sprechererkennung brauchen wir gar nicht in einem
Machine Learning Modell machen, sondern das weiß man
ja schon. Ich haue
einfach die Spuren getrennt durch
Whisper durch oder so und dann
kann ich auch sagen, wer das gesagt hat
und dann habe ich das, ja,
dass die original, also sozusagen die
rohen Spuren vor Auphonic
sind halt von den Zeiten her anders
als das, was nachher rausfällt, weil
halt manchmal Stille rausgeschnitten wird
oder manchmal wird das halt auch so ein bisschen
transformiert und dann passen die ganzen
Zeitstempel nicht mehr. Und Jochen hat die nicht
aufgehoben, die einzelnen Spuren.
Ja, von Auphonic kriegt man auch die einzelnen Spuren zurück.
Nach dem
Mastering sozusagen. Aber die habe ich nicht
aufgehoben. Und die werden nach irgendwie
zwei Wochen oder 20 Tagen irgendwie gelöscht.
Das heißt, ich muss entweder alles nochmal durch
Auphonic schieben.
Oh no. Oder irgendwie
es gibt für die alten Folgen dann halt
jetzt nur die Transkripte ohne Namen
dran. Vielleicht ist das auch
schon okay. Genau. Und dann für die zukünftige
mache ich das dann halt so, dass man dann auch die Namen
an den Sprechern hat.
Ja, aber Transkripte,
da tut sich was. Das kommt jetzt.
Wir hatten das ja irgendwann schon mal so ein bisschen probiert. Das war so relativ
fürchterlich, aber so ist es eigentlich relativ cool.
Ja.
Genau.
Ja, wir wollten auch picken, oder?
Picken wir nicht immer? Genau.
Genau.
Ich muss ja wieder irgendwas für dich Triviales picken.
Dann fange ich mal damit an, weil ich ja mal irgendwas anderes
denke.
Hat nichts mit unserer Folge zu tun, aber
ich habe
ab und zu mal Geld bezahlt tatsächlich irgendwie für
ordentliche Freistellung von Bildern.
Keine Ahnung mehr warum, aber das war schon
ein bisschen länger her. Es gibt ein tolles Paket,
das heißt RemBG oder sowas.
Das macht einfach den Background
weg als Kommando-Teilen-Tool von irgendwelchen Bildern.
Wenn man das will. Super praktisch.
Oh.
Falls man sowas braucht.
Das war's.
Jetzt d ihr vern Sachen klicken Ich mach mal weiter mit den unvern Sachen die auch nichts mit der Episode zu tun haben aber mit der Zeit in der wir leben Und zwar ist k die neueste gr Primzahl gefunden worden
Ah, ja.
Das ist eine Mersenne-Primzahl, die heißt M136279841.
Also 2 hoch 136.279.841 minus 1 ist eine Primzahl.
waren sehr viele
GPUs beteiligt an der
Überprüfung und
das ist die erste seit
28 Jahren,
die erste große Primzahl
nach 28 Jahren.
Diese Primzahl hat 41 Millionen
24.320
Stellen.
Und das allein ist schon
eine schöne Sache. Aber das Schöne,
was ich gefunden habe, was heute mein Pick ist,
ist eine Initiative,
die versucht, diese Zahl
zu sagen, bevor die
nächste größte Primzahl
gefunden wird.
Und zwar
als verteilter Prozess.
Da gibt es eine Webseite, die heißt
saytheprime.com.
Da kann man sich 419
Stellen geben lassen.
Die nimmt man dann als Video auf,
lädt das Ganze auf YouTube hoch,
schickt den Link ein und die machen
dann eine ganz, ganz, ganz, ganz, ganz
große Playlist draus,
die hoffentlich
diese Primzahl insgesamt sagt.
Und das Ziel dieser Initiative
ist es, diese Primzahl einmal
zu sagen, bevor die nächste
größere Primzahl
gefunden wird. Wahrscheinlich kann man sich einfach mit selber
multiplizieren und dann nochmal wieder eins abziehen, dann hat man das schon.
Ja, das
diese Zahlen berechnen ist nicht
so schwierig, aber
das Beweisen, das ist eine Primzahl.
Was ist die Schätzung, wie lang diese Playlist,
wie viele Jahre
die spielen wird?
Sie schlagen
vor,
dass man ungefähr
mit 120 BPM spricht.
Das heißt, es wären zwei Ziffern
pro Sekunde. Das heißt, es wären
ungefähr
20 Millionen Sekunden.
Das ist gar nicht so viel.
20 Millionen Sekunden.
20 Millionen Sekunden ist ungefähr
eine Woche oder so.
Jetzt müssen wir es mal ausrechnen.
Das ist ein halbes Jahr oder so.
Warte mal, das sind
41 Millionen Sekunden.
Achso, dann
230 Tage.
Ja,
243 Tage.
Dreivierteljahr.
Tja.
Es geht gar nicht darum,
dass es jemand sich dann anhört,
sondern es geht darum, dass es einmal gesagt
würde. Wir können ja jedes Mal jetzt an
einer Episode, so einer kleinen Episode von dieser Primzahl
mitsehen. Einfach im Hintergrund
laufen.
Jeder, wer möchte, kann daran teilnehmen.
Es gibt ein sehr schönes Video von Matt Parker,
wo er die Zahl einmal anzeigt
in seinem Video.
Also er hat dann
in jedem Frame zeigt er glaube ich
1000 Ziffern an und das geht dann eben über
so und so viele
Sekunden oder vielleicht zeigt er 10.000 Ziffern
in jedem Frame. Auf jeden Fall irgendwie 3,5 Minuten
lang zeigt er diese Zahl an und spricht über die
Zahl. Und das ist quasi
das Audio-Äquivalent und jeder kann damit
mithelfen und ich finde
jeder von uns sollte das tun.
Das ist mein Pick für diese
Woche. SayThePrime.com.
Ich habe tatsächlich auch über die Priebszahl nachgedacht,
weil es ist nämlich relativ,
ich finde es relativ lustig, dass man die
in Python problemlos ausrechnen kann.
Also überhaupt kein Problem, einfach mal
zwei hoch 136
Millionen zu rechnen. Das dauert
quasi keine bemerkbare Zeit. Es sind
so 16 Megabyte Zahl ungefähr.
Vielleicht ein bisschen ineffizienter dargestellt,
aber die zu printen
ist komplett unmöglich.
Weil im Zweiersystem
ist das halt eine sehr einfache Zahl,
sind lauter Einsen.
Aber im Zehnersystem,
das Zehnersystem umzuwandeln,
das ist halt nicht linear zu machen,
sondern das ist irgendwie N log N
oder so.
Also es ist ja eh inzwischen
standardmäßig so, dass man große
Zahlen nicht mehr
printen kann standardm gibt es dieses Limit Das war auch irgendwie ein Security Problem also ein Denial Genau ja Aber selbst wenn man das Feature ausschaltet dann dauert es halt einfach zu lang Also das ist ein Ja
Zum Glück kann man die Zahl runterladen.
Gibt es auf mercen.org,
gibt es eine ZIP-Datei, 18 Megabyte.
Falls man die braucht für irgendwas.
Kann man den Leuten statt X schicken,
statt den X-Sourcen.
Ja.
Gut, das ist mein völlig unkorrelierter Pick, aber es passt irgendwie in unsere Zeit rein und das ist alles relativ neu. Also es ist vom 21. Oktober, als die Bestätigung kam.
Ja.
Oder CF, ich meine, keine Ahnung.
Ich würde ja ungern
die Reihenfolge an völlig
absolut nichts mit dem Thema zu tun
haben, denn Pics
unterbrechen.
Ich habe auch einen, der gar nichts mit dem
eigentlichen Thema jetzt dieser Episode zu tun hat oder auch nicht
mit Python oder sonst irgendwas.
Und zwar, ich war jetzt letztens auf so einer
Podcaster-Konferenz
auf der Subscribe11 in Berlin
und
Subscribe10 ist übrigens schon vier Jahre
her oder so? Fünf, die waren 2019.
Ja, okay, fünf.
Da waren wir auch und dann dachten wir, ja, da gehen wir
zunächst auch und nichts war jetzt gerade fünf Jahre
später. Ja, da war so zwischendurch
irgendwie waren da so leichte
Pandemieschwankungen irgendwie am Start und das
hat halt... Ja, egal.
Ja, es war auch
kleiner als, also es waren deutlich weniger Leute
da als jetzt vor
fünf Jahren und das liegt,
lag vor allen Dingen daran, dass
inzwischen so
Infrastruktur auch weggebrochen ist, die vorher
ganz gut funktioniert hatte, nämlich
Social Media. Also das war so ein Ding,
alle, die man traf, sagten, ja, also klar,
früher konnte man sowas, aber heute geht das ja nicht mehr,
weil Social Media ist ja tot,
daher kann man das nicht mehr machen. Also man kann zum Beispiel
für so eine Konferenz auch nicht mehr gut Werbung machen, weil man
kann den Leuten nicht mehr davon erzählen, weil
ja, wo
will man es den Leuten denn noch erzählen? Es gibt ja
irgendwie nichts mehr. Und
dann war halt so die Frage, okay, was kann man
denn jetzt tun, wenn es das nicht mehr gibt?
Und da war eine der Antworten halt, ah,
naja, wir haben ja doch irgendwie ein Medium
gerade so, wir haben da, baden da gerade
unsere Hände sozusagen drin.
Warum sagen wir nicht irgendwie in
unseren Podcasts quasi,
dass es solche Sachen gibt?
Und dann war auch die Idee, dass man da so
ein bisschen Werbematerial oder so schon mal fertig
macht, dass man das eigentlich direkt verwenden kann. Das ist
dann noch nicht passiert, aber ich dachte,
das kann ich jetzt mal nutzen, um das zu sagen, dass es sowas gibt.
Und wenn man irgendwie da Interesse dran hat,
kann man da auch hingehen. Auch als Hörer,
da waren zum Beispiel... Du meinst den nächsten in fünf Jahren?
Nee, die nächste ist schon in einem halben Jahr.
Die Frequenz so ein bisschen erhöhen
und die nächste ist daher schon
im Frühjahr nächsten Jahres.
Und es gab am Anfang so eine Vorstellungsrunde,
wo alle gesagt haben, was sie so tun.
Und da waren tatsächlich ein paar Leute dabei.
Eine
Person hier auch aus Düsseldorf, die sie
bezeichnet sich als Extremhörerin.
Es waren auch viele Hörer da.
Das war sehr schön.
Schöne Veranstaltung und ich weiß nicht, wo die nächste ist.
auch Berlin.
Gleicher Location, also Weißensee.
Und in Mai...
Wie viele Stunden ist man extrem höher?
Pro Tag?
Ja, viele, viele pro Tag.
20 oder?
Und sie meinte, ich war mit ihr
auf einem Hörertreffen
am Samstagabend von einem anderen Podcast
und
da ist halt so, ja, also
es ist immer schwer zu sagen,
wie viele Stunden Podcast ich denn jetzt so höre, weil
ich höre immer auf irgendwie
so zweieinhalbfacher Geschwindigkeit,
worauf alle am Tisch so
ja,
da muss man sich langsam rantasten.
Da fängt man nicht mit an. Man fängt zuerst an
mit so 1,2 und dann 1,5
und dann geht das immer langsamer.
Schnell als 1,5 ist das schon.
Ja, aber inzwischen kann ich das halt auch gar nicht mehr
auf einfache Geschwindigkeit hören, weil da denke ich mir so was.
Ja, bei den meisten kostet das für mich auch nichts.
Ich finde es ja total lustig.
Also man gewöhnt sich ja da wirklich total dran.
Ich bin nicht so extrem.
ich höre vielleicht 1,2 oder 1,5 oder so
und an das Sprechen gewöhnt man sich
total, aber wenn man so
eine Zeit lang irgendwas mit normaler
Geschwindigkeit und dann erhöht gehört hat, die Jingle
klingt immer falsch. Also
selbst Jahre, ich höre jetzt, was weiß ich,
wie heißt der
Microsoft C Hansel Minutes h ich seit Jahren 20 schneller Die Jingle klingt immer noch falsch
Es gibt gute Jingles, die hören sich auf unterschiedlichen
Geschwindigkeiten ähnlich interessant an.
Ich habe einen Python-Pick.
Oha.
Es gibt eine super kleine Studie von
Eric Catril, das ist eine
C-Python-Core-Entwicklerin, die eine
Studie darüber gemacht hat,
wie viel PIPI-Pakete
Return, Break oder Continue
Anweisungen in Finally-Blöcken machen.
Weil es gab nämlich so eine kleine Diskussion
darüber, dass man, ob man vielleicht
also
Except-Doppelpunkt, also ohne
Angabe einer Exception-Typ
abschaffen sollte.
Irgendwann in einer der nächsten Versionen, da gab es total
viel Gegenmeinung und dann haben
sie das Vorhaben auch wieder aufgegeben, aber
eine der Ergebnisse von der Diskussion war eben
einfach mal zu gucken, wie sieht das denn mit Finally aus?
und Return, Break und
Continuum und Finally haben ja so ein bisschen so komische Effekte,
wenn man Return macht, dann wird die
Exception geschluckt. Also wenn ich quasi
Try-Finally habe und
der Code wirft eine
Exception und in dem Finally-Block mache ich dann
Return, dann return ich halt einfach
von der Funktion und die Exception verschwindet.
Und deswegen hat
Iris eben gesagt, sie schaut mal,
wie das in, Moment, hier steht
irgendwo, wie viele Pakete sie sich angeschaut hat,
die 8000 beliebtesten
PyPI-Pakete analysiert,
eben ein Script geschrieben, was
die abstrakten Syntaxbäume
durchgeht und schaut, ob eben das
finally-blocking-with-break-continue-and-return
drin vorkommt
und dann von Hand analysiert,
wie viele von denen
quasi wirklich so sein
sollen und wie viele von denen Bugs sind.
Also es waren 120 Millionen Zeilen Python
und darin waren
200 Fälle von
Kontrollflussinstruktionen
Instruktionen in Finally-Blöcken.
Davon waren 46
korrekt, aber diese 46
waren lauter Tests in
irgendwelchen Lintern, die
eben sicherstellen wollten, dass der
Linter sagt, bitte verwende kein Return in Finally.
Acht Fälle waren
wirklich korrekt, also wirklich, wo
es quasi gewollt ist, dass die Exception dann
geschluckt wird. Und 149
waren dann eben Bugs,
die EritKadriel
dann auch immer bei den entsprechenden GitHub
Repositories gemeldet hat und die meisten
dieser Bugs werden jetzt gefixt.
Also so sieht schon so ein bisschen aus,
als wäre das jetzt nicht so das wichtige Feature und
auch ein Feature, was vielleicht eher
zu
ja, zu
Missanwendungen als zu
korrekten Anwendungen führt. Sehr schön.
Ja. Und wenn ihr wollt,
habe ich noch einen mega nerdy Pick.
Oh ja. Es gibt ein Paper,
was ein C-Compiler
für eine sehr kleine Teilmenge von C
nach Shell übersetzt.
Und das
ist vollständig genug, dass der C-Compiler
sich dann, wenn er sich
selbst nach Shell übersetzen kann
und dann kann ich quasi, wenn ich nur
irgendeine beliebige Unix-Shell habe, kann ich
einen sehr kleinen C-Compiler
bootstrapen.
Und
also die haben auch Gründe,
das sind irgendwelche Forscher,
die gute Gründe dafür haben, warum sie das machen.
Die haben Gründe.
Nee, die haben so Trusting-Trust-Gründe, also damit kann man halt sicherstellen, dass man keine langlebigen Backdoors im Compiler hat, aber die Gründe sind mir egal. Warum ich das toll finde, ist, es gibt ja immer diese Argumente, C ist eine schnelle Sprache, weil die ist compiled und Python ist eine langsame Sprache, die ist interpretiert und von solchen Argumenten halte ich gar nichts, weil das ist halt eine Eigenschaft der Implementierung, ob was compiled oder interpretiert ist.
Ich kann halt kompilierte Python-Implementierung
haben und interpretierte.
Das ist keine inhärente Eigenschaft der Sprache.
Und das ist einfach so ein schönes
Gegenbeispiel, dass ich
quasi eine kompilierte
Version von C habe, die halt trotzdem
ultra langsam ist.
Okay, sehr schön.
Ja, sehr schön.
Ja, ich würde sagen, das war ein passendes Schlusswort
für das.
Jetzt könnt ihr auch wieder runterdrehen, eure Geschwindigkeit
beim Hören.
Und
Wir wünschen euch einen wunderschönen Tag,
wunderschöne Nacht, wunderschönen Morgen, wunderschönen
Aufstehen. Bleibt uns gewogen,
for all his feedback und so weiter.
Bis bald.
Tschüss.
Tschüss.