Transkript: Arrays und Sequenzen

· Zurück zur Episode

Vollständiges Transkript der Episode. Zeitstempel beziehen sich auf die Audiowiedergabe.

Dominik

Ja, hallo liebe Hörerinnen und Hörer, willkommen beim Python-Podcast.

Dominik

Heute Episode 59.

Dominik

Hi Jochen.

Jochen

Herzlich willkommen, Dominik.

Jochen

59, meine Güte.

Dominik

Ja, hi Johannes.

Jochen

Und hallo Johannes.

Dominik

Wir machen heute weiter mit dem Flut-Python-Buch, haben wir uns gedacht.

Jochen

Ja, genau.

Jochen

So, hat sich bewährt.

Jochen

Ja, da bleiben wir jetzt.

Wir machen nur noch das.

Es ist ja Fleisch.

Jochen

Wenn wir hinten angekommen sind, dann machen wir es immer rückwärts.

Johannes

Dann haben wir es schon vergessen, dann müssen wir es vorher direkt wieder vorlesen.

Dominik

Ja, wir hatten, also das Kapitel 2 hat was mit Sequenzen und Listen und sowas zu tun.

Dominik

Da hatten wir jetzt schon mal eine Folge, ne?

Dominik

Erinnert euch?

Ja.

Ja.

Johannes

Aber da gibt es einfach immer noch mehr zu sagen.

Jochen

Genau, ich hatte da auch nochmal reingeguckt kurz.

Jochen

Und wir haben da, also das ist ein bisschen orthogonal, das ist gut.

Jochen

Also es ist halt von der anderen Seite nochmal angegangen.

Jochen

Und da das Thema sowieso irgendwie wichtig ist, dann kann man das auch von mehreren Seiten mal irgendwie angehen.

Jochen

Das ist eigentlich ganz gut.

Jochen

Okay.

Dominik

Haben wir denn News?

Jochen

Ja, so ein bisschen.

Jochen

Ich hab jetzt ja ist halt die Frage, was da alles so drunter fällt.

Jochen

Python 3.3C, das machen wir jetzt nicht, aber das kommt jetzt ganz bald.

Dominik

Ja, also ich finde ja den REPL so schön.

Jochen

Ja.

Jochen

Genau, habt ihr euch alle schon so ein bisschen damit beschäftigt und noch gar nicht?

Jochen

Nee, gar nicht.

Jochen

Noch gar nicht.

Dominik

So ein ganz kleines bisschen.

Jochen

Ja, also genau, also ja, ist jetzt dann.

Dominik

REPL ist total toll.

Dominik

Du kannst einfach Defaultsets eintragen, den er automatisch lädt, Pakete in deinem REPL.

Dominik

Das heißt, wenn du den Interpreter aufmachst, dann hat der Pakete schon geladen.

Dominik

Oder damit kannst du halt auch Sachen dann überschreiben, weil er dann die Pakete lädt, die er laden soll und du hast einen Befehlssatz drin direkt, den du möchtest.

Dominik

Also eine eigene Konfiguration für deinen Rappl direkt haben.

Jochen

Man kann einfach Exit eingeben und ist draußen und Multiline-Editing und Multi-History ist ordentlich und so.

Johannes

Das finde ich jetzt alles nicht so beeindruckend, weil ich habe eh immer ein iPython über.

Jochen

Ja, aber rate mal, wer das nicht hat.

Der Dominik.

Jochen

Nee, die Python-Entwickler.

Jochen

Deswegen alle neuen.

Die schauen dann mit Neid, schauen diese Punkt.

Jochen

Ja, aber das iPython ist so cool.

Jochen

Aber das geht nicht.

Jochen

Ja, oder genau, und das geht alles nicht, weil das läuft ja mit einer neuen.

Jochen

Und in der Entwicklung der befindlichen Python-Version funktioniert das halt nicht.

Jochen

Das heißt, die müssen immer die Python-Rapel verwenden und die sagen alle, ach, das ist so viel besser jetzt, ach, das ist so cool.

Ja, das ist typischer Software-Entwicklungsmechanismus, oder?

Johannes

Softwareentwicklung durch Neid.

Dominik

Ja, erstmal bitte ein bisschen Reningbogenfarben irgendwie in der Konsole, dann macht

Jochen

das Spaß.

Jochen

Ja.

Jochen

Und ein großer Teil davon kommt halt auch, oder kam, also Anregungen dafür kamen aus PyPi.

Jochen

Und dann haben sie es jetzt aber nochmal durch die Mangel gedreht und alle möglichen Sachen gefunden, die man irgendwie besser machen kann als soll, zu überlegen sie, ob der Kram, den sie in Ziphalten jetzt gemacht haben, nicht zurückgeht nach PyPi wieder.

Jochen

Ja.

Aber das ist cool.

Jochen

Also, das ist auf jeden Fall, ähm, das sind einige Sachen, die jetzt auch da immer wieder zwischen den Leuten da diskutiert werden und so.

Jochen

Und da ist auf jeden Fall eine fruchtbare Diskussion immer so im Stall.

Jochen

Ich höre ja diesen Copy by Podcast und da ist eigentlich PiPi immer mit dabei oder ja Karl Friedrich Reband als, ah, da wird irgendwas interessantes dazu gesagt.

Jochen

Ja, also das ist auf jeden Fall cool.

Jochen

Genau, Python 3.13, die Rapper-Geschichten.

Jochen

Ja, es gibt halt, also das größte, das dickste Feature, was immer alle nennen, ist halt Free Threading.

Jochen

Also man kann den Gill abschalten.

Jochen

Ja, also ich.

Johannes

Das sind schon, das würde ich schon sagen, das sind schon nennenswerte News.

Jochen

Ja, ja, schon, schon.

Jochen

Klar, und so in gewissen Fällen bringt das sicherlich auch viel, aber.

Die auch vielleicht eine eigene Episode braucht.

Jochen

Ja, genau, da müsste man auch mal.

Nogio.

Genau.

Jochen

Ja, das ist halt auch mit.

Hashtag Nogio.

Jochen

Ja, überhaupt dieser ganze der.

Jochen

Es gibt einen Just-in-Time-Compiler, der jetzt mit dabei ist.

Jochen

Der macht zwar noch nicht viel, aber er ist auf jeden Fall jetzt drin.

Jochen

Das heißt, da könnten man in Zukunft auch irgendwie einige coole Performance-Verbesserungen erwarten.

Jochen

So ein Copy-and-Patch.

Jochen

JIT ist jetzt tatsächlich im Python-Interpreter mit drin.

Jochen

Ja, was haben wir noch alles?

Jochen

Zum Zimtzim.

Jochen

Genau, es gibt jetzt farbige Fracepks.

Jochen

Auch wieder so ein bisschen Alltag irgendwie ein bisschen besser.

Dominik

Ja, gut, das sind aber natürlich die Messages und so.

Dominik

Also er hat auch immer einen guten Hint.

Dominik

Er erst jetzt nicht einfach irgendwas und denkt sich so, oh ja, komische Straightbacks, weiß nicht wo, sondern er hat oft schon eine gute Intuition, was das sein könnte.

Jochen

Ja, genau.

Jochen

Da ist jetzt auch alles.

Johannes

Also da sind jetzt Dinge verschieden große Signifikanz dabei, würde ich sagen.

Jochen

Ja, aber tatsächlich für Anfänger, also was die oft irgendwie ein Problem, das sie hatten, ist, du machst, du nennst dein Python-Modul oder Skript, das du gerade schreibst, nennst du halt genauso wie ein Standard-Lib-Modul.

Jochen

Und wenn du das dann versuchst, wenn du das versuchst auszuführen passiert, kriegst du eine total kryptische Fehlermeldung, die dir echt gar nicht weiterhilft.

Jochen

Und da gibt es jetzt eine Fehlermeldung, die sagst, also kann es sein, dass du das so genannt hast wie ein Standard-Library-Modul, das ist aber nicht gut.

Jochen

Mach das mal anders.

Jochen

Und das ist natürlich hilfreicher irgendwie.

Johannes

Ja, das ist tatsächlich was, was in Python-Kursen oft vorkommt, weil man ja irgendwie, die haben naheliegende Namen und wenn du dann eine Funktionalität schreibst, die sich mit einem Thema beschäftigt, dann wählst du den naheliegenden Namen für deine Python-Datei und schon hast du das Modul überschrieben.

Johannes

Deshalb, das ist schon gut, aber ich würde sagen, es ist, sagen wir mal, technologisch weniger fortschrittlich oder weniger kompliziert als Hashtag NoGo.

Jochen

Ja, das ist richtig.

Jochen

Da ist eine ganze Menge E-Teining-Aufwand drin gewesen, glaube ich.

Jochen

Ja, ansonsten, genau, ich weiß gar nicht, ich habe noch irgendwas zu lesen.

Jochen

Wir machen dazu, wir machen zu 3.13 auf jeden Fall auch noch eine Episode, denke ich, dann können wir dann mal alles zusammentragen.

Jochen

Ja, ansonsten, was war noch?

Jochen

Django 5.1 gibt es auch irgendwie jetzt.

Ja, aber ändert sich da irgendwas?

Jochen

Da war auch, also nichts, was ich mir jetzt so spontane Erinnerung geblieben wäre daher.

Jochen

Ja, also

Johannes

diese Django Releases, da gibt es ja sehr viele immer.

Johannes

Und ich habe das Gefühl, also klar, die machen Sicherheit, die machen so Verbesserungen und dann machen sie schon immer mal wieder coole Sachen.

Johannes

Da mit diesen Postgres-JSON ändern sich ja schon schöne Dinge, aber so richtig.

Jochen

Oh, wir haben da schon drüber gesprochen, glaube ich.

Jochen

Wir haben schon nochmal gesprochen.

Jochen

Diese Query String-Geschichten und so brauchen wir nicht nochmal.

Jochen

Ja, ich hätte, ich habe mir die News nicht abgestimmt nochmal.

Johannes

Ja, ja, aber ich meine, Django fühlt sich an, als ob es so stabil ist, dass es sehr inkrementelle Verbesserungen sind.

Jochen

Ja, ja, und

das ist ja was Gutes.

Das ist ja auch was Gutes, genau.

Jochen

Das wäre ja was Gutes, würde ich auch sagen.

Jochen

Dass man sich darauf verlassen kann, dass es halt, was man jetzt weiß, wie es funktioniert, dass es auch so bleibt.

Jochen

Ja, aber ich hätte noch eine Überleitung zu einer ganz interessanten Frage, vielleicht, wenn wir jetzt hier schon eigentlich mit den News mehr oder weniger am Ende sind.

Jochen

Also ich weiß nicht, ob ihr noch was habt.

Jochen

Ich hätte jetzt nur noch irgendwie, es gibt neue LLM-Modelle, sowas wie One oder One.

Kann man jedes Mal als News sagen.

Jochen

Genau, es gibt neue, probiert es mal wieder aus.

Es gibt ein 700

Milliarden-Parameter-Modell von Lama.

Johannes

Lama 3.1700b.

Jochen

Das, äh, ja, brauchst

Johannes

du den größeren Rechner.

Dominik

Also O1 Previous ist ja aber trotzdem auch noch New.

Dominik

Und das ist, also ich höre, das ist besser als Cloud wieder.

Jochen

Ja, also bisher, also genau, ich würde sagen, also diese, also auch diese ganze Artefaktsnummer, ich habe jetzt in letzter Zeit häufig Claude, also das Chat-Interface von Anthropic verwendet, weil das halt einfach für Code-Geschichten oft ein bisschen besser war als GPT-VO.

Jochen

Und ja, und aber jetzt inzwischen, also ich weiß nicht genau, ich habe es noch nicht wirklich ausprobiert, ehrlich gesagt, weil es ja auch gerade erst rausgekommen ist aber das soll halt sich dann auch nochmal wieder ein bisschen ein bisschen besser drüber sein.

Jochen

Also es ist auf jeden Fall, also ich finde es jetzt schon super alles.

Jochen

Also es ist auch das ganz normale GPT-VO und so war auch schon super und die Entropic-Dinger fand ich auch total klasse.

Also ich bin eigentlich sehr gut.

Dominik

Es ist ein gutes Zeichen, wenn ein Chief Machine Learning Engineer Mensch Entropic nicht kennt.

Jochen

Das wäre ein schlechtes Zeichen, würde ich meinen.

Jochen

Ja, wie kann das denn sein?

Jochen

Also gut, ich meine, du kannst Machine Learning ist halt ein großes Feld.

Ja, ja, genau.

Jochen

Ja, du kannst dich ja auch in irgendwas spezialisieren oder in einem ganz anderen Feld irgendwas machen, mit LLMs nie irgendwas zu tun haben, aber ja gut.

Ja, also es war schon ein bisschen.

Also die großen Namen musst du ja schon wissen, oder?

Also.

Die Landschaft kennen.

Johannes

Jetzt haben wir jetzt gerade eben hier mit dem Karriere versaut.

Dominik

War eigentlich eine gute Antike, ich bin gespannt.

Dominik

Also O1, ich finde es echt very nice.

Dominik

Hilft.

Dominik

Also es ist so ein bisschen fehlerfreier bei Coding-Ding.

Dominik

Und so ein bisschen deeperes Knowledge und es macht sehr viel Spaß, diesen Gedankengang zuzugucken.

Dominik

Und das, was ja auch neu, das ist aber schon bei 4O drin, ist halt, dass du ein Gedächtnis hast jetzt auch, ne?

Jochen

Ja, also, was sie da so nennen, ich meine nicht.

Dominik

Doch, doch, das ist schon, das funktioniert auch.

Dominik

Man muss sich halt überlegen, ob man möchte, dass das gespeichert wird, sowas spricht.

Johannes

Bitte merkt ihr alles, was ich hier gesagt habe.

Ja.

Dominik

Aber für eine Sachen ist es gar nicht so schlecht, weil, also, ja.

Ja.

Interesting.

Jochen

Ja, ich meine, also wenn man jetzt LLMs über die Kommandozeile mit dem LLM-Tool zum Beispiel benutzt, dann hat man das ja auch irgendwie wieder.

Jochen

Was ist halt lokal, ne, SQLite, ich weiß nicht.

Jochen

Ja, ist auch immer die Frage, ne?

Jochen

Wie möchte man dieses Ziel eigentlich zeigen?

Dominik

Ja, also ich frage tatsächlich nach so einer Morgenroutine oder sowas und sagt dann halt so, hey, was ich denn so mache und dann schlägt das Ding mir halt so Dinge vor, es ist so, macht mit mir so Rituale und so.

Dominik

Ich finde es sehr lustig und das funktioniert toll.

Und das ist, glaube ich, gar nicht so blöd.

Dominik

Weil es einen so dabei hält, sich so selber zu entwickeln.

Jochen

Ja, cool.

Dominik

Das kann man natürlich auch mit anderen Quellen machen, dass man jetzt da irgendwie so ein AI verbräuchte, aber es geht damit sogar relativ gut.

Jochen

Ja, genau.

Jochen

Ansonsten würde ich nämlich Django irgendwie mal kurz zu einer Überleitung nutzen, da wir jetzt sowieso nicht so viel News haben.

Jochen

Ich hab, äh, und ich mache gerade ein neues Projekt, weil irgendwie ich prokrastiniere sogar die Dinge, die ich eigentlich machen sollte.

Jochen

Und naja, wer kann das nicht?

Und prokrastinieren.

Produktives.

Jochen

Genau, der New Repository-Button bei GitHub irgendwie immer so shiny und fängt an zu leuchten und dann denkt man sich, ah, es geht nicht anders, ich muss draufdrücken und dann habe ich das halt mal wieder gemacht.

Jochen

Und genau, ich bin nämlich gerade dabei, irgendwie mal meine Bewerbungsunterlagen, beziehungsweise so CV und so Zeugs irgendwie auf einer Webseite zu, weil ich hätte das immer so in Textfile, aber dann habe ich fünf unterschiedliche Varianten, die alle nicht aktuell sind und irgendwie für unterschiedliche Zwecke gebraucht wurden.

Jochen

Und ich bin so, naja gut, welches nehme ich denn jetzt und dann weiß ich es nicht.

Jochen

Und dann denke ich mir, ah, sie müssen mal und ah, alles schrecklich.

Jochen

Und warum packe ich das nicht einfach auf eine Webseite?

Sorry, ganz gut.

Dominik

Ja, ich habe auch mal ein paar gute gesehen, wo ich mir noch eine To-Do-Liste habe, wo draufsteht, dass ich mir ein Vorbild daran nehmen wollte.

Vielleicht ist das dein Zug.

Johannes

Ich hab auch schon mal so ein Projekt angefangen, ja.

Jochen

Ja, gut, dann jeder muss ich sagen.

Dominik

Ich hab meine Sache immerhin schon mal in Markdown stehen, das ist schon mal ein Fortschritt.

Jochen

Ja, das ist schon.

Jochen

Markdown ist schon mal nicht so schlecht.

Johannes

An der Stelle muss man jetzt sagen, jeder Softwareentwickler den mal beauftragen kann.

Jochen

Ja, ja, vielleicht sollten wir das nochmal.

Johannes

Also, falls jemand zuhört, der den Jochen oder mich beauftragen muss.

Oder mich.

Dominik

Also das ist ja genau der Dominik auch.

Dominik

Ja, wir wollten halt so ein bisschen vielleicht auch heute mal unsere eigenen Sachen machen, oder?

Dominik

Können wir ja auch nicht mehr so ein bisschen.

Jochen

Können wir ja gerne machen.

Dominik

Also ihr könnt uns mieten, buchen oder sowas, wenn ihr wollt.

Jochen

Wir sind prinzipiell käuflich.

Dominik

Ja, also für Projekte.

Dominik

Wir machen, glaube ich, Python.

Dominik

Das ist alles

Johannes

eine Frage des Preises.

Johannes

Bei interessanten Sachen sind wir auch zur Diskussion bereit, oder?

Dominik

Also, von ein bis drei Leuten könnt ihr da relativ viel Kappa bekommen, die auch gute Sachen machen, glaube ich.

Johannes

Ich habe gehört, wir haben alle ein Buch gelesen.

Oh ja, genau.

Jochen

Wir könnten eigentlich mal mit dem Thema anfangen.

Dominik

Listen, haben wir gesagt.

Dominik

Sequenzen.

Sequenzen, genau.

Johannes

Das zweite Kapitel ist deutlich länger als das erste Kapitel.

Das erste Kapitel war so ein Häppchen.

Jochen

Ja.

Johannes

Und das zweite Kapitel ist schon ein Brocken.

Jochen

Wie weit hast du denn gelesen?

Johannes

Bis zum Ende des zweiten Kapitels.

Jochen

Seite 39.

Johannes

Ja, sowas ungefähr.

Johannes

Keine Ahnung, wie weit.

Johannes

Das ist jetzt, muss ich jetzt nachgucken.

Jochen

So wahnsinnig viel fand ich das.

Johannes

Seite 58.

Jochen

Dann hast du wesentlich weitergelesen.

Johannes

Das Chapter 2, An Array of Sequences.

Dominik

Also das mit 59 geht auch weiter bei der List des Not-Zehners.

Dominik

Und dann geht es so ein bisschen die Diskussion darüber, wann man was machen möchte.

Also ich glaube,

Johannes

genau, das ist tatsächlich, das habe ich mir extra markiert.

Johannes

Es geht bis Seite 77.

Johannes

Oh Gott.

Johannes

Und Seite 59 ist nämlich das, worüber ich mit euch dann gleich sprechen möchte.

Johannes

So schlecht ist das ja erst am Ende des Kapitels.

Dominik

Ja, ja, also wir müssen auf jeden Fall diese Trade-Offs, finde ich, glaube ich, ganz gut, wann man was für eine Art und Weise von Sequenz haben möchte.

Dominik

Vielleicht gar nicht so uninteressant.

Jochen

Ja, also ich finde auch genau, denn deren, also der grundsätzliche Blickwinkel drauf, finde ich, den finde ich ganz interessant, weil wir hatten ja schon mal darüber geredet und da hatten wir eher den so, ja, wie implementiert man das eigentlich oder was sind so die algorithmischen Geschichten, die man damit machen kann.

Jochen

Und hier sind so die grundsätzlichen Unterschiede zwischen den Dingen halt eher sowas wie, ist es ein Container oder ist es irgendwie flach?

Jochen

Oder ist es irgendwie mutable oder immutable, sozusagen.

Jochen

An den Achsen orientiert sich das Ganze irgendwie und das ist einfach ein anderer Blickwinkel und das fand ich eigentlich auch ganz interessant.

Jochen

Ja.

Jochen

Jedenfalls, genau.

Jochen

Also das ist halt irgendwie eine ganz fundamentale Geschichte.

Jochen

Und der Unterschied zwischen Swirkle Container und Flat ist halt einfach, dass in einem Container sind halt Referenzen auf Objekte drin und da kann halt alles mögliche drin sein, da kann ein ganzer Zoo, Baum, sonst was Dings von irgendwie anderen Sachen, die da noch drin liegen, sein.

Jochen

Während, also, und das geht natürlich mit Liste, also Python-List geht das.

Jochen

Während jetzt sowas wie, was halt auch eine Sequenz ist, ein Array, enthält halt flach einfach nur die entsprechenden Werte.

Jochen

Halt ein Header mit irgendwie, wie sind die Daten dahinter jetzt strukturiert und dann kommen halt einfach nur die Daten.

Jochen

Und genau, das ist halt, das ist halt schon mal ein großer Unterschied.

Jochen

Das fand ich bei uns auch interessant, das habe ich nicht gewusst, dass Tuppel halt auch weniger Hauptspeicher belegen als die.

Jochen

Also Tuppels sind immer ein bisschen schneller als Listen.

Jochen

Weil das ist bei Listen halt so doppelt indirekt.

Jochen

Weil es sich ja auch ändern kann und bei Tuppel nur einmal indirekt.

Jochen

Jetzt habe ich das Stelle nicht mehr.

Johannes

Also, aber das ist vielleicht auch was, was man erwähnen kann.

Johannes

So eine Liste verbraucht a priori schon mal mehr Speicher, weil es Platz haben muss für zukünftiges Wachstum.

Johannes

Und wenn ich das richtig in Erinnerung habe, dann machen Listen so ein exponentielles Wachstum.

Johannes

Das heißt, die haben immer eine gewisse Menge leerer Elemente im Hintergrund und ich glaube, das sind zwei Potenzen.

Johannes

Das heißt, wenn man diese Größe überschreitet, dann passiert da so ein Resizing und dann verdoppelt sich diese Liste.

Johannes

Das heißt, in dem Moment hat man dann etwa 50% des potenziellen Speichers einfach verschenkt, weil da keine Referenzen drin sind.

Johannes

Wobei Referenzen natürlich relativ klein sind.

Johannes

Also die sind jetzt nicht im Kilobyte-Bereich, sondern die sind natürlich nur im Pointer Plus.

Jochen

Ja, also

Johannes

die sind im Pi-Object-Bereich.

Jochen

Genau, 8 Byte.

Johannes

Ich glaube, es sind mehr, Jochen, oder?

Johannes

Das sind doch Pi-Objects, die da drin sind.

Jochen

Achso, wenn du das im Python-Object, ja, da hast du normalerweise, du hast einmal einen Ref-Count.

Johannes

Da hast du so einen Tag drin und so einen Typ.

Jochen

Der Typ und die Speicheradresse oder sowas.

Johannes

Hast du nicht auch noch einen Reference-Count drin?

Jochen

Genau, genau.

Jochen

Also ich meine, das minimale

Johannes

20 was

Jochen

das minimale Python-Objekt ist ein Float oder Int, ich weiß nicht, ob es genau gleich ist.

Jochen

Float, bin ich mir ziemlich sicher, dass es das kleinste mögliche Python-Objekt ist und das hat, glaube ich, 24 Byte, weil das ist halt genau irgendwie der Wert Referenz-Kerze.

Jochen

Ja, du meinst bei kleinen Werten oder.

Johannes

Bei Float ist es sogar inlined, oder?

Johannes

Da hast du keine Referenz auf irgendeine andere Speicherzelle.

Nee, nee, Float ist

einfach direkt drin.

Jochen

Das ist einfach direkt, genau.

Jochen

Das ist nur der Wert direkt, RevCown und der Typ.

Jochen

Aber auch das sind schon halt 24 Byte.

Für im Grunde nur

Johannes

8 Byte-Speicher.

Johannes

Hast du schon 24 Byte Speicher verbunden?

Jochen

Genau.

Johannes

Aber die Größe ist ja gleich egal, ob du ein Tupel oder eine Liste hast.

Jochen

Ja, das ist richtig.

Johannes

Aber also die freien Elemente, das hast du beim Tupel natürlich nicht.

Johannes

Beim Tupel sagst du, hier, ich brauche sieben Stück und dann kriegst du sieben Stück und nicht 8 und nicht 16 und auch nicht eine andere Anzahl.

Dominik

Ja, und du kannst halt vielleicht bessere Optimierung machen, weil du immer genau weißt, wie lange es ist, weil du ja schon weißt, was dort steht, weil du das nicht mehr verändern kannst.

Dominik

Und du kannst diese ganzen Methodendinger weg und den Overhead weglassen für ich muss da was reinbasteln oder rausnehmen.

Johannes

Ja, okay, aber du hast natürlich einen Virtual Table, hast du immer noch.

Johannes

Ja, weiß nicht, ob das der große Unterschied ist.

Dominik

Ja, man durfte nicht so viel ausmachen.

Jochen

Okay, ich habe es auch gefunden.

Johannes

Ja, okay, da sind

wir komplizierter.

Jochen

Ich dachte gerade schon, ich habe schon irgendwie, dachte schon, wahrscheinlich habe ich einfach die Dinge hierbei halluziniert und nein.

Jochen

Also genau.

Jochen

Ja, ja.

Jochen

Manchmal, man weiß es nicht so genau.

Jochen

Genau, die Referenzen zu den Items in einem Tuppel sind halt in einem Array.

Jochen

Die sind halt in einem Array, in dem Tupelsdruck halt drin.

Jochen

Aber in der Liste sind quasi, also die Liste hält einen Pointer zu einem Array von Referenzen, die irgendwo anders sind, weil das Problem ist halt, wenn die Liste größer wird, als sie eigentlich quasi als momentan adnoziert ist an Speicher, dann muss man den ganzen Kramrier adozieren können und das geht halt nur, wenn du Ja, das ist dieses Resizing.

Jochen

Genau, genau.

Jochen

Und das macht halt nochmal einen Direktionsschritt erforderlich.

Jochen

Und bei einem Tuppel weißt du halt, ja, das passiert halt nie.

Jochen

Ich kann einfach ein Array von den Werten nehmen.

Also von den Titel.

Okay, das ist quasi so ein

Johannes

bisschen wie das, was wir eben auch schon beim Float angesprochen haben, oder?

Johannes

Bei einem Pie-Object kann ein Float direkt drin sein und dann hast du keine Referenz auf irgendwas.

Bei einem String zum Beispiel geht es sich.

Johannes

Bei einem String, das Pie-Object ist halt der Tag und der Typ und der Rev-Count und die Referenz auf die tatsächlichen Daten.

Johannes

Und hier ist es genauso, oder?

Johannes

In einem Tuple kannst du es direkt drin haben.

Johannes

Und in einer Liste brauchst du erst noch eine Referenz auf die tatsächlichen Daten.

Genau.

Johannes

Die dann wiederum halt in dem Fall eine Sequenz von Sachen sind, im Tuple-Fall direkt die Sequenz der Sachen und im Listenfall eine Referenz auf eine Sequenz von Sachen.

Okay.

Johannes

Ja, okay, gut, das verstehe ich natürlich.

Johannes

Das ist ein Pointer-Aufruf mehr und Pointer-Aufrufe sind ja bei modernen Prozessoren so das Schlimmste, was du machen kannst.

Jochen

Ja, es ist alles kein großer Unterschied wahrscheinlich, praktisch.

Jochen

Aber ja.

Boah, müsste man mal einen Test machen.

Jochen

Ja.

Johannes

Es gibt ja durchaus Menschen, die sagen, nur High-Performance Computing ist sinnvolles Computing.

Dominik

Das ist ja generell so, oder?

Dominik

High Performance ist sinnvoll.

Jochen

Dieses Casual irgendwie Slow Food, ich verpasse.

Jochen

Ich schreib meinen eigenen Soltier-Algorithmus, es ist ja nicht nur

Johannes

richtig sinnvoll, wenn du es richtig machst.

Johannes

Nee, aber es ist, also ich meine, es gibt ja so Leute, es gibt diesen KC Muratory, der ist relativ bekannt, der schlägt immer wieder auf mit solchen, der ist halt, der vertritt quasi diese extreme Position.

Johannes

Wenn du es nicht richtig machst und dann auch hier die SIM-Dee-Inlines von den verschiedenen Prozessoren benutzt, dann hast du es eigentlich gar nicht richtig gemacht.

Johannes

Und das ist die Ursache allen Übels, deshalb ist ein Computer heute so scheiße.

Johannes

Und das ist natürlich das eine Extrem und das andere Extrem sind halt, naja, so Menschen wie wir, die Python und JavaScript benutzen und sagen, komm, Skriptsprache, Hauptsache das entwickeln, ist angenehm.

Johannes

Und irgendwo dazwischen, ich meine, gelegentlich machen wir ja auch High-Performance-System.

Johannes

Da muss man dann halt zu Techniken greifen.

Dominik

Also die Frage ist, was High Performance eigentlich ist.

Dominik

Da gibt es ja vielleicht verschiedene Blickwinkel drauf.

Johannes

Ja, gibt es auch verschiedene Blickwinkel, wobei, sobald du halt in so Data-Bereiche reingehst, ja, und sobald es mehr als ein Megabyte ist, musst du schon dir zumindest Gedanken drüber machen, ob das sinnvoll ist, das einzelelementweise zu verarbeiten oder ob du da nicht zumindest ein bisschen Batchverarbeitung machen kannst.

Johannes

Und je mehr, je mehr es wird, umso mehr musst du drüber nachdenken.

Johannes

Aber in so einem Fall würde natürlich auch keiner von uns eine Python-Liste verwenden, oder?

Johannes

Also ich meine, für numerische Daten oder für mehr Performance-Daten würde ich nicht eine Python-Liste verwenden.

Dominik

Was denn dann?

Johannes

Das ist ja eine sehr gute Frage, zum Beispiel, der Jochen hat schon angesprochen.

Array.

Johannes

Das ist der erste Schritt auf dem Weg zur Effizienz und ist sogar in Python und pures Python und so weiter

und so fort.

Dominik

Import Array, Array.array.

Ja, genau.

Johannes

Genau, richtig.

Johannes

Die generelle Eigenschaft von so High-Performance-Sachen ist ja immer, dass man Komfort aufgibt für Geschwindigkeit.

Johannes

Und das ist generell so, ja.

Johannes

Und man kann das in beide Richtungen beliebig weit treiben.

Johannes

Man kann den Komfort komplett aufdrehen und dann halt sagen hier, Typen sind egal und alle ein Container kann alles enthalten und auch nichts und verschiedene Dinge und so weiter und so fort, so wie wir es in Python bei Listen haben.

Johannes

Und du kannst aber auch ganz ans andere Ende gehen und sagen, okay, Simdi und das muss im Speicher an der richtigen Stelle liegen und es muss Byte-Aligned sein und das muss so aufgebaut sein, dass die Cache Lines zusammenpassen.

Johannes

Und das ist aber eine Skala dazwischen, ist so eine sliding Scale dazwischen.

Johannes

Du kannst das ein bisschen mal weiter in die eine Richtung drehen oder ein bisschen weiter in die andere Richtung drehen.

Johannes

Und der erste Schritt, den du von Python-Listen wegmachen kannst, ist halt Array, Array.array.

Johannes

Weil das ist dann nicht mehr diese Indirektion, sondern es ist direkt eine Auflistung von Dingen, also eine Abfolge von Dingen, die auch direkt da drin gespeichert werden.

Johannes

Das bedeutet aber halt, dass die alle gleich sein müssen.

Johannes

Und da fällt schon der erste Komfortteil rein.

Johannes

Du musst vorher wissen, was du da reintust.

Dominik

Vielleicht kannst du kurz, was ist Cache-Inline?

The Cash Line.

Johannes

Das braucht, glaube ich, auch eine eigene Episode, aber das ist eine Eigenschaft von Prozessoren.

Johannes

Wir haben ja eben schon gesagt, wenn du irgendwie einen Pointer aufrufst, dann ist das das Schlimmste, was du machen kannst.

Johannes

Weil der Hauptspeicher eines Computers wesentlich langsamer ist als der Prozessor eines Computers.

Johannes

Das hat sich so entwickelt.

Johannes

In den 80ern und 90ern war es noch nicht so, da waren die irgendwie gleich schnell.

Johannes

Und dann sind die Prozessoren exponentiell schneller geworden und der Speicher ist halt nur quadratisch schneller geworden.

Johannes

Und dann waren die Prozessoren auf einmal eine Million Mal schneller als der Speicher und deshalb ist das das Problem, in dem wir leben.

Johannes

Und das, ja, da kommen jetzt Worte, die hat sicherlich jeder schon mal gehört.

Johannes

Jeder Prozessor hat irgendwie so einen L1-Cache.

Johannes

Das ist der Hauptspeicher, der ganz nah am Prozessor ist, der ist noch fast genauso schnell wie der Prozessor selbst.

Johannes

Und dann gibt es den L2-Cache, der ist auf dem gleichen Prozessor-DIE drauf, aber daneben und ist deshalb nicht mehr ganz so schnell, also nur noch nur ein Zehntel so schnell wie der Prozessor.

Johannes

Und dann gibt es den L3-Cache bei den neuen Prozessoren, der ist vielleicht auf dem gleichen Chip, aber nicht mehr auf dem gleichen Die und deshalb ist nochmal zehnmal langsamer.

Johannes

Und dann gibt es den Hauptspeicher und der ist nochmal tausendmal langsamer.

Johannes

Und das ist eben so ein Trick, weil man weiß, es gibt was, das heißt Data Locality.

Johannes

Wenn ich mit einem Datum, mit einem Datenpunkt gearbeitet habe, dann werde ich vielleicht mit Datenpunkten, die in der Nähe gespeichert sind, arbeiten.

Johannes

So funktionieren diese Caches.

Johannes

Das heißt, die speichern eine kleine Speichermenge aus dem Hauptspeicher in den Prozessor rein.

Johannes

Und wenn ich dann tatsächlich mit dem daneben liegenden Datenpunkt arbeiten möchte, dann habe ich da den schnelleren Zugriff, weil der schon gecached ist.

Johannes

Und prinzipiell, wenn man alle Leistungen aus einem Prozessor rausholen möchte, dann muss man dafür sorgen, dass der Prozessor immer nur solche Sachen bearbeitet, die schon im

Dominik

Cache sind.

Dominik

Da muss man quasi an die richtige Stelle hüpfen vorher.

Johannes

Da muss man, genau, da gibt es Techniken, wie du dafür sorgen kannst, dass bestimmte von diesen Cache Lines, diese Caches sind in sogenannte Lines aufgeteilt.

Johannes

Das heißt, da hast du immer 16 Byte drin oder 64 Byte.

Johannes

Oder je nachdem, also die werden natürlich größer, ja, je nach, je weiter du nach draußen gehst.

Dominik

Kurz vor das Passwort, was da irgendwo im Speicher steht, möchte ich gerne springen oder kurz danach.

Johannes

Ja, wenn du das versehentlich in den Cache-Lässt, ist auch schlecht.

Johannes

Wenn du diese Cachlines immer wieder überschreibst, ist schlecht, wenn du immer über die gleiche Cache line hast.

Johannes

Aber da sind wir jetzt natürlich wesentlich näher am Prozessor, als wir mit Python je hinkommen.

Johannes

Das Wichtige an der Stelle zu wissen ist, dass wenn wir im Hauptspeicher hin und her springen, dann ist das potenziell was sehr Langsames.

Johannes

Weil dieser Hauptspeicher erst in den Prozessor reingeholt werden muss, damit er da verarbeitet werden kann.

Johannes

Und das ist in Prozessorzeiten eine Ewigkeit.

Dominik

Also das ist das, was Assembler macht, wenn es irgendwas in Register reinlädt.

Johannes

Genau, wenn du es in den Register reinlädst, das ist quasi das, was im Prozessor ganz innen drin ist, das Register-File.

Johannes

Das ist das Schnellste, das ist in den Prozessor eingebaut.

Johannes

Und danach werden die Hierarchien, wird es in der Hierarchie immer um Faktor 10 oder 100 oder 1000 langsamer.

Johannes

Wenn du es jetzt also schaffst, dafür zu sorgen, dass deine Daten möglichst nah beieinander liegen, dann bedeutet das, dass wenn du die sequenziell verarbeitest, dass die dann schon näher am Prozessor dran sind und entsprechend schneller verarbeitet werden können, als wenn du für jeden Eintrag einmal in den Hauptspeicher springen musst und das komplett nah reinholen musst.

Johannes

Und das ist ja üblicherweise die Situation, die du hast, wenn du eine Python-Liste hast.

Johannes

Das ist das, weshalb diese doppelte Indirektion so langsam ist, weil du einmal zuerst die Liste der Dinge, der Referenzen abholen musst und dann nochmal die Referenz selbst.

Johannes

Und selbst wenn du da sequenziell durchgehst, können diese, sag ich mal, Second-Level-Referenzen, die können ja irgendwo liegen, wo halt gerade der Speicher hinalotiert wurde.

Johannes

Bei einem Array ist das aber anders.

Johannes

Bei einem Array liegen die Werte alle hintereinander direkt aneinander gereiht im Speicher.

Johannes

Das heißt, wenn du durch einen Array.array durchgehst, das sind, man muss ja auch ein bisschen vorsichtig sein, dieses Wort Array hat ja in jeder Sprache eine andere Bedeutung als in der Programmiersprache.

Johannes

Wir sprechen ja jetzt von Python-Arrays.

Johannes

Also in Python das Modul Array.array enthält so eine Implementierung von einem Container, der Daten des gleichen Typs im Speicher sequentiell gepackt speichern kann.

Johannes

Also zum Beispiel Floats oder Integers oder andere Dinge, die man da reintun möchte.

Johannes

Und das hat den Vorteil, dass wenn ich da sequentiell durchgehe, dass die dann prinzipiell mehr der Prozessorarchitektur entsprechen, dass ich nichts in Direktionslevel habe, dass ich die eventuell schon im Cache bereit liegen habe, wenn ich sie verarbeite.

Johannes

Und so, wenn ich eben numerische Datenverarbeitung machen möchte, kann das sein, dass das ein extremer Speedup ist.

Dominik

Aber es geht nur für numerische Daten?

Jochen

Naja, was letztlich da drin ist, weißt du ja nicht, also was heißt numerische Daten.

Jochen

Also es muss eine feste

Dominik

Zahlen oder sowas.

Jochen

Ja, aber auch wenn du jetzt da, gut, kommt halt darauf an, was, aber das kann ja auch was irgendwas anderes bedeuten.

Jochen

Das kann ja Text sein oder also.

Dominik

Okay, aber bei Text bedeutet das dann halt Immutability.

Dominik

Also weil die Repräsentation des Textes als Zahlen immer dasselbe sind sowieso

im Immutable ist.

Jochen

Genau, Immutable, aber ich würde mal zum Beispiel, ich habe mal eine Array-Geschichte benutzt in CyclitLearn bei dem Tokenizer, also bei dem TF, äh, TF-IDF-Vactoriser.

Jochen

Und da waren es dann halt IDs von, also die Nummer von einem Token.

Jochen

Das ist ja dann nur eine Nummer.

Jochen

Und die kann man ja auch in Arrays packen.

Ja, oder Booleans, Arrays von Booleans, geht ja auch, ja.

Jochen

Also die Frage ist, sind das jetzt numerische Daten?

Jochen

Ich weiß nicht.

Jochen

Also, naja, was die Daten bedeuten, ist so egal.

Jochen

Also klar, es muss natürlich irgendwie was mit was Fixes sein, aber.

Jochen

Und ach so, das kann auch anders strukturiert sein.

Jochen

Das ist jetzt, weiß ich gar nicht, ob das mit Array-Array geht, ob das viele kompliziertere Struktur haben kann, aber es gibt allgemein Memory-Views und die sind halt dafür da, dass du halt diese Daten irgendwie durch den rumschieben kannst und du kannst da halt einen anderen Header davor setzen, zum Beispiel mit einem NumPy oder so, und dann ist das plötzlich ein mehrdimensionales Array oder halt irgendwie eine Matrix oder sowas.

Jochen

Oder du kannst halt, und Transformationen, wenn du jetzt sagst, okay, ich möchte das jetzt einmal kippen oder irgendwie transposen oder was auch immer, dann sind das nur Operationen, die nur den Header betreffen, aber nicht die Daten selber.

Jochen

Also die Daten bleiben halt so liegen, wie sie da so sind, halt im Hauptspeicher.

Jochen

Ja.

Johannes

Wobei Transposition Jochen ist ja auch so was Gefährliches.

Johannes

Dann hast du wieder, wenn du den Speicher dann nicht auch transponierst, dann hast du wieder schlechte Speicherzugriffspattern.

Jochen

Ja, ja, das kann natürlich dann blöde Konsequenzen haben, wenn man dann halt irgendwas Blödes damit macht.

Johannes

Ja, gut, ich kann mit jeder Programmiersprache schlechte Programme schreiben, das ist gar kein Problem.

Johannes

Nee, ich meine nur, okay, aber da bist du jetzt schon einen Schritt weiter, ja.

Johannes

Also Array ist ja schon, ist ja noch, da übernimmt Python noch so ein Business Management für dich, aber bei Memory View ist ja hier eine Sequenz von Bytes, die im Hauptspeicher liegen.

Genau.

Johannes

Mach damit, was du willst.

Johannes

Und da bist du wieder direkt einen Schritt weiter in Richtung Performance.

Potenziell, ja.

Johannes

Also man kann alle Werkzeuge wenden, um langsame Programme zu schreiben.

Johannes

Bist du einen Schritt weiter in Richtung Performance und einen Schritt weiter weg von Komfort.

Johannes

Weil du dich halt selber drum kümmern musst.

Johannes

Aber dafür kannst du prinzipiell so Tricks machen, dass du den Header veränderst oder dass du nur irgendwelche Sachen innen drin veränderst oder dass du, keine Ahnung, je nachdem, was das Problem halt erfordert.

Machst du.

Johannes

Ja, jetzt sind wir wirklich schon ganz tief zwischen Abschluss des Kapitels, nämlich der Abschluss des Kapitels heißt When a list is not the answer, der Hauptteil des Kapitels beschäftigt sich ja schon mit Listen, ja.

Johannes

Und da gibt es, also es sind wirklich schöne Sachen drin.

Johannes

Wusstet ihr, dass man auf Slices assignen kann?

Jochen

Oh ja, das ist cool.

Johannes

Das ist ein Trick, den ich nicht so, also den ich nicht kannte, den ich nicht wusste, dass das geht.

Dominik

Was meinst du mit Snices Assign?

Dominik

Vielleicht müssen wir es kurz erkennen.

Johannes

Ja, also wenn ich eine Liste habe, dann kann ich mir da ja einen Slice rausholen.

Johannes

Also wenn ich eine Liste mit zehn Elementen habe, kann ich sagen, ich möchte Element 3 bis 4.

Johannes

Das ist dann diese Doppelpunkt-Notation und dann kriege ich da eben so eine Subliste raus.

Johannes

Und diese Subliste ist aber nicht, die ist mutable.

Johannes

Und die bezieht sich auf die Elemente, die in dieser ursprünglichen Liste drin waren.

Dominik

Also wie ein View auf diese Liste an der Stelle.

Johannes

Ja, so ein bisschen, aber noch mehr.

Johannes

Weil, also wenn ich jetzt hier so einen Slice raushole aus dieser Liste, nehmen wir mal an, ich habe eine Liste, die ja das ist jetzt hier ein Beispiel drin, Seite 50, falls jemand mitlesen möchte.

Johannes

Da ist eine Liste, das ist eine Liste von Range von 10.

Johannes

Also es sind die Elemente 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 drin.

Johannes

Und da hole ich mir jetzt einen Slice raus, Index 2 Doppelpunkt 5.

Johannes

Das sind drei Elemente, die ich hier raushole, 2, 3 und 4.

Johannes

Und da mache ich jetzt eine Zuweisung auf diesen Slice.

Johannes

Also ich sage L Slice 2 bis 5 ist gleich.

Johannes

Und hier in dem Beispiel ist es jetzt 20,30.

Johannes

Also eine Liste mit nur zwei Elementen.

Johannes

Dann habe ich aus dieser Liste was rausgeschnitten und dann die Stelle, an der das vorher drin stand, was anderes reingeschrieben.

Johannes

Und das wusste ich nicht, dass es geht.

Johannes

Das wusste ich nicht, dass man da so Operationen drauf machen kann.

Johannes

Also von Slices quasi ganze Slices ersetzen kann.

Dominik

Man kann es ja rückwärts machen.

Johannes

Man kann auch einen Slice löschen.

Johannes

Das nächste Beispiel ist Dell von denen und dann hast du in der Mitte was rausgelöscht.

Super.

Jochen

Tatsächlich, da wäre ich auch nie auf die Idee gekommen, dass das zu machen.

Johannes

Aber es wird noch schlimmer, Jochen.

Johannes

Das wird noch schlimmer.

Johannes

Das nächste Beispiel ist ein Slice, der einen Step hat.

Jochen

Oh, oh, oh Gott, oh Gott, oh Gott.

Jochen

Ja, okay.

Johannes

Und wenn der auf den zuweist, dann werden halt die Elemente ersetzt, die diesen Step abbilden.

Dominik

Alles klar.

Dominik

Also kannst du ein gerade

Johannes

Element kannst du ersetzen.

Johannes

Mit einer Zuweisung.

Jochen

Ja.

Wusste ich nicht.

Jochen

Okay, nee, das waren wir jetzt auch nicht.

Jochen

Da kann man auch, also da, ja.

Dominik

Wo wir bei Dingen, die wusste ich nicht waren, da habe ich ja auch eben was rausgefunden.

Dominik

Und zwar, dass man halt Dinge direkt das heim kann, wenn zum Beispiel eine Liste mit einem Element rumkommt.

Dominik

Hat ja auch gesagt, der benutzt das ständig.

Dominik

Aber wenn irgendwo eine Liste und man will das ein Element haben, dann machen oft ja die Leute Index 0, aber man kann einfach das Sign zu einem Ding, was in der Ecking dran steht.

Jochen

Genau, man macht vorher Eckyklammer auf, irgendwie das Element, gibt dem Namen Ecky-Kammer wieder zu.

Jochen

Ich habe das oft in Tests oder so, wenn ich weiß, also da kann halt nicht mehr drin sein als dieses eine Ding, dann mache ich das halt so.

Okay.

Jochen

Ja, auch das ist natürlich, aber das Problem ist, sag mal so, wenn das jetzt unerwarteterweise aber was anderes zurückgeben sollte, was nicht nur an dieses eine Ding hat, sondern halt vielleicht fünf.

Ja, okay.

Dann fällt das bei mir halt.

Johannes

Ich krieg keine Fehler mehr.

Dominik

Du kriegst einen Index-Error, aber ich krieg einen Value-Eror.

Johannes

Nee, ich krieg keinen Index-Error.

Johannes

Ich krieg nur einen.

Jochen

Es kann halt sein, dass es weiter funktioniert.

Dominik

Ja, nur wenn es die 0 nicht gibt.

Jochen

Genau, du kriegst nur einen Fehler, wenn es die 0 nicht gibt und die 0 gibt es eigentlich immer.

Dominik

Genau, bei uns das wäre es halt Value-Eror, weil das Element irgendwie nicht.

Dominik

Die Liste nicht das eine Element enthält, sondern irgendwas anderes.

Johannes

Ein Unpacking Error, das ist doch schön, oder?

Ja.

Johannes

Ja, also dieses Kapitel ist, wie gesagt, das ganze Buch ist ja tatsächlich so, dass es sich nicht direkt an, sag ich mal, blutige Einsteiger richtet, sondern es ist schon so, du hast die Basics drauf, hier sind so ein paar Kniffe, jetzt hier so geht es auch.

Johannes

Und das ist doch schön, dass man auch hier so Veteranen wie uns noch damit überraschen kann.

Jochen

Mit Sachen, die in der

Johannes

mit Sachen aus dem puren Standard, ja, aus dem puren Python-Standard.

Johannes

Hier, übrigens, Assigning to Slices.

Was?

Jochen

Ja.

Jochen

Gut, vielleicht mag das auch der Grund sein, warum ich das Buch echt gerne lese.

Jochen

Man kann kaum irgendwie eine Seite oder zwei lesen, ohne dass man sich denkt, so, ach, echt interessant, das wusste ich jetzt gar nicht.

Jochen

Und ja, das ist halt, das macht so.

Ja, dann guckt er sich den Bytecode an und sagt, ja,

Jochen

auch was ich auch gut ist, jetzt nochmal ganz am Anfang von dem Kapitel, was ich auch super fand, ist, dass er halt, dass er auch so etwas, wo ich denke, ja, das ist so, aber ich traue mich manchmal nicht so richtig, das laut zu sagen, weil irgendwie, irgendwie, die Prophezeiung irgendwie vorsieht, dass irgendwie Vorschleifen lesbarer sind als List-Comprehensions, aber ich denke gerade bei einfachen Fällen sind List-Comprehensions tatsächlich bess

er lesbar.

Jochen

Und hier hat er halt ein schönes Beispiel, wo er halt quasi den Zahlenwert von einem ASCII-Zeichen aus einem String halt rausnimmt.

Jochen

Und wenn du das halt in der Vorschleife machst, also einmal sind halt doppelt so viele Zeilen und dann ist es halt so, dass irgendwie der entscheidende Aufruf, der dir sagt, was passiert, der ist halt irgendwie relativ weit irgendwie reingenestet und der fällt dir stich einem nicht sofort ins Auge.

Jochen

Während die List Comprehension, da siehst du halt sofort, was passiert.

Dominik

Ja, also ich bin auch ein großer Fan von schönen Comprehensions.

Dominik

Wir hatten schon mal eine Unterhaltung, Jochen durch, wo du der anderen Meinung warst, aber es kommt halt drauf an.

Es kommt darauf an, genau.

Jochen

Es ist halt nicht so.

Johannes

Sind wir hier unter die Juristen gegangen?

Johannes

Es kommt drauf an.

Johannes

Wir wollen definitive Antworten.

Dominik

Comprehensions sind schön Pythonic und in vielen Fällen sind sie einfach das Syntax sogar Schönere, als jetzt eine Vorschleife zu machen.

Dominik

Es sei denn, man möchte bestimmte Dinge tun, wo dann Vorloop explizit angebracht ist.

Dominik

Das Eins, was man meinst,

Johannes

nicht nur List Comprehensions, auch Dikt Comprehensions und Set Comprehensions.

Dominik

Ja, aber auch da, also manchmal ist es so ein bisschen so, manchmal, gerade dann, wenn man gucken will, wie langsam irgendwas werden kann, wenn man solche Sachen nestet hat oder sowas, dann könnte es sein, dass das so ein bisschen Sachen versteckt, weil er nicht explizit fünfmal vorsteht und man fünfmal vorzählt oder die nested Levels und dann sieht man, da könnte irgendwas kaputt sein

oder so.

Johannes

Ja, wobei, ich versuche ja, so, nested Comprehensions versuche ich eigentlich zu vermeiden.

Johannes

Die mache ich dann lieber untereinander, wenn es geht.

Jochen

Ja, wobei er hat hier auch ein schönes Beispiel für ein Ding, wo man das nesten will und wo es Sinn macht, das so hinzuschreiben.

Jochen

Weil bei einer List Comprehension hast du ja immer, also naja, das ist Fluch und Segen zugleich, es baut dir halt eine Liste zusammen.

Jochen

Und der Nachteil bei einer Liste ist halt, sie muss halt irgendwie da sein, sie muss halt irgendwie materialisiert sein.

Jochen

Und jetzt hat er hier zum Beispiel diese.

Dominik

Den Trick, den du gerade überflogen hast, den fand ich auch sehr, sehr schön, wo er innerhalb von der List-Comprehension noch eine Assignment-Expression baut, die dann tatsächlich genau dem letzten Element erspricht, wenn du da irgendwas berechnest.

Jochen

Nee, das ist auch so ein Quirk.

Jochen

Also normalerweise haben die ihren eigenen Scope.

Jochen

Das heißt, wenn du halt da irgendwie so einen lokalen Namen für irgendwas hast.

Dominik

Der wird halt jetzt mal wieder überschrieben bei jedem.

Jochen

Nee, da passiert normalerweise

Johannes

gar nichts.

Oder in einer Python-Version.

Jochen

Ja, das ist nicht ein, ich weiß, es ist die Frage, ob das ein Bug ist oder nicht, aber also sagen wir mal so, normalerweise ist alles so, wie man das erwarten würde.

Jochen

Aber wenn man jetzt nicht irgendwie gleich sagt oder nicht einfach nur die Variable verwendet, sondern man sagt halt Doppelpunkt gleich irgendwas, dann ist man aus dem Scope raus und dann ist man in dem Scope von dem von dem Ding drumherum und dann passieren unerwartete Sachen, weil dann überschreibt das halt eventuell Sachen, die halt im Scope außenrum sind und ja.

Dominik

Naja, aber vielleicht will man das ja machen.

Jochen

Ja, vielleicht.

Johannes

Vielleicht.

Dominik

Ja, aber das Beispiel, da ist zum Beispiel super.

Johannes

Das ist halt kein Python, sondern obfuscated Python.

Dominik

Nein.

Dominik

Aber das letzte, was da steht, das ist halt zum Beispiel ein total tolles Beispiel, weil du hast so irgendwie so eine Screenfash, du wirst wissen, war die letzte Addition davon, war der letzte Aufruf der Funktion.

Dominik

Und den kannst du halt einfach dann Assignment Expression und dann hast du den einfach direkt und kannst den ins Log schreiben oder so oder was du auch immer damit machen willst.

Jochen

Ja, okay.

Johannes

Assignment Expression ist Wahlraus-Operator, oder?

Jochen

Ja, genau, genau.

Jochen

Ja klar, das kannst du natürlich schon so machen, aber du hast dann hoffentlich keine Variable, einen Code vorher verwendet, die irgendwie LAT heißt und sonst.

Nein, Fußgeschossen.

Dominik

Ja, das sollte man da tatsächlich eh nicht tun, oder?

Dominik

Also dass man davon ausgeht, dass dann in der Variable in der List Comprehension die Sachen alle wieder vergessen werden.

Dominik

Ja, nein.

Ja, normalerweise ist das so.

Dominik

Ja, aber gut, aber da steht halt auch dann gleich drin, ne?

Jochen

Ja, aber da geht

Johannes

es aber auch relativ lange drum in dem Kapitel, dass man da hier diese Reihenfolge, dass das manchmal überraschend ist und dass die manchmal.

Dominik

Also ja, genau, ich mag auch dann so Bedingungen, die können wir auch untereinander schreiben, wie fest dies, das.

Dominik

Aber ja, schönes Python, würde ich sagen.

Jochen

Genau.

Jochen

Ich wollte nochmal kurz zurück zu dem, also was wo braucht man eventuell so eine Nested, also Doppelt-Vorloop irgendwie Geschichte?

Jochen

Und wo kann es Sinn machen, da eben das halt so hinzuschreiben und nicht eine Vorloop?

Dominik

Wenn die Dimensionalität der Daten das übersteigt, was man in einer einzigen Spalte darstellen kann.

Dominik

Also wenn man Relations hat.

Jochen

Ja, oder er nimmt hier als Beispiel ein kathesisches Produkt von irgendwie zwei Iterables oder Sequences vielleicht.

Jochen

Und wenn du das halt in der Vorschleife machen willst, dann brauchst du ja was über, das du iterieren kannst und dann musst du das halt in eine Liste packen.

Jochen

Und wenn das halt fünf Zeilen, fünf Spalten sind, dann ist es halt wenig.

Jochen

Aber wenn du jetzt tausend Zeilen und tausend Spalten hast, dann ist es plötzlich wahnsinnig viel und dann willst du das halt nicht irgendwo hinspeichern.

Jochen

Also gerade wenn du dich eigentlich nur diese, du hast jetzt tausend von der Sorte und tausend von der Sorte, das ist das, was dich eigentlich interessiert.

Jochen

Das musst du auch irgendwo speichern, aber das kathesische Produkt davon eigentlich nicht, dann geht das mit einer Vorschleife eigentlich gar nicht so gut, wenn du nicht dieses Produkt materialisiert irgendwie rumliegen haben willst.

Jochen

Und was er dann macht, ist eine Generator Expression, die halt so eine doppelte Vorschleife drin hat.

Jochen

Und das ist natürlich cool, weil die erzeugt nämlich, das verbraucht gar keinen Hauptspeicher, sondern das generiert ja einfach nur das

Dominik

typische Produkt.

Dominik

Wenn ein Generator halt hast, ja.

Genau, genau.

Jochen

Und denen kannst du ja den Generator halt dann als Generator Expression schreiben und dann.

Johannes

Was ist denn der Unterschied, Jochen?

Johannes

Wie schreibt man denn eine Generator Expression im Vergleich zu einer List-Kompression?

Johannes

Ja, das muss doch was ganz anderes sein, oder?

Runde Klammer.

Jochen

Genau das gleiche ist es halt bloß eine Runde Klammer, genau.

Johannes

Das ist auch eine Falle, in der man leicht tappen kann.

Johannes

Dass man runde Klammer macht und es sieht erstmal so aus und das funktioniert auch in vielen Fällen so ähnlich.

Ja.

Johannes

Nur wenn man es dann nochmal verwenden möchte, ist es leider weg.

Jochen

Genau, das ist ein überraschend anders.

Jochen

Also ich meine, meistens ist wahrscheinlich List-Comprehension auch tatsächlich das, was man haben möchte.

Jochen

Aber ja, es gibt auch nicht.

Dominik

Also ich würde gerne noch da Fragen zu stellen und so ein bisschen wissen, wann man welche Dinge denn benutzt.

Dominik

Und ich würde sagen, Gegenerator Expression im Vergleich zu List Comprehension, wann ich eine Liste nehme, wann nehme ich ein Array, wann nehme ich ein Collection CQ, diese ganzen Dinge so ein bisschen auseinanderzuhalten mit ihren Trade-offs wäre vielleicht nicht ganz uninteressant in dieser Folge heute.

Jochen

Oh, ja, okay.

Jochen

Also ja, weiß nicht.

Johannes

Das sind viele tiefgehende Fragen, die du dargestellt hast.

Johannes

Also die eine Frage kann man leicht antworten.

Johannes

Du brauchst eine List-Comprehension, wenn du die Daten materialisiert brauchst, also wenn du sie darauf zugreifen willst und mehrmals darauf zugreifen willst.

Dominik

Okay, und kostet aber viel Speicher.

Johannes

Out of Sequence und Indexzugriff kostet halt Speicher.

Johannes

Du brauchst eine Generator Expression, wenn du sie nur einmal brauchst und nur in Reihenfolge und

Jochen

wenn es vielleicht zu viel ist, um es am Hauptspeicher zu halten.

Nicht nochmal drauf zugriffen.

Johannes

Und genau, und wenn es zu viel ist, um zu sagen.

Dominik

Dann zum Beispiel mache ich sowas wie der Skritischer.

Johannes

Genau.

Johannes

Also wenn es quasi eine Prozedur ist, die du da machst.

Johannes

Ja, das ist relativ leicht zu wenden.

Johannes

Aber jetzt die Frage, wo benutzt du List versus Array versus Memory View?

Jochen

Ah ja, das kann man so allgemein.

Ah, da

Johannes

müssen wir länger drüber sprechen.

Johannes

Und wenn du da noch andere Sachen reintust, wie

Jochen

Deck oder Deck oder eine Q oder wie auch immer du sie nennst.

Jochen

Also der Vorteil bei diesen Datenstrukturen ist.

Johannes

Das sieht man den Deck Deck aus.

Deck, Dick, DQ, Dick.

Jochen

Ich habe das immer Deck genannt, aber ich weiß nicht genau, ob es nicht.

Johannes

Sie nennen es auch immer Deck, aber keine Ahnung.

Dic?

Warte mal her.

Johannes

Hier gibt es Aussprache, warte mal.

Dominik

Bitte lesen Sie diesen Begriff vor.

Johannes

Der Deck, sagt der, sagt Leo.

Okay.

Johannes

Ich benutze immer Leo für sowas.

Johannes

Okay.

Johannes

Dickt.leo.org, wichtigstes Werkzeug.

Johannes

Der sagt Deck in schönem, feinen britischen Englisch.

Aha.

Jochen

Ja, also sowas hat man halt vor allen Dingen dann, wenn du möchtest, dass die Sortierreihenfolge halt irgendwie gleich bleibt.

Johannes

Nee, halt, warte mal.

Johannes

Erstmal musst du erklären, was ein Deck ist.

Oh Gott.

Ein Deck.

Jochen

Also, ich weiß jetzt auch gar nicht, wie der.

Double Energy.

Jochen

Double Energy, ja.

Jochen

Ich weiß jetzt auch gar nicht, wie genau die Implementation in Python da aussieht.

Johannes

Ah, spielt keine Rolle.

Jochen

Spielt keine Rolle.

Jochen

Ja, also der Witz an dem Ding ist ein Deck.

Jochen

Ist halt, dass du sozusagen Sachen rausnehmen kannst, reinnehmen kannst und trotzdem ist es halt immer sortiert und du kannst halt.

Dominik

Also weil du einen Follower und einen Prezessor hast.

Johannes

Also eine Queue ist eine Warteschlange.

Johannes

Und eine Double-Ended-Queue heißt, du kannst auf der einen Seite was reinschieben und auf der anderen Seite kannst du was rausnehmen.

Johannes

Und die bleiben in der Reihenfolge.

Dominik

Also das heißt, ich habe beide Enden.

Dominik

Also ein bisschen und einen Folger.

Jochen

Ja, ja, ja.

Johannes

Genau.

Johannes

Und das ist, da gibt es so ein Pattern, das Producer-Consumer-Pattern, wo du sagst, du hast halt eine Prozedur, die erzeugt Datenpunkte und du hast eine Prozedur, die verbraucht Datenpunkte und dann hast du, dann ist die Deck genau das, was da dazwischen ist.

Johannes

Der eine tut sie eben auf der einen Seite in das Deck rein oder in die Deck.

Johannes

Und der andere, der sie verbraucht, der nimmt sie auf der anderen Seite raus.

Johannes

Und das kannst du prinzipiell mit einer Liste machen.

Johannes

Du kannst eine Python-List als Deck verwenden, indem du halt Punkt Append machst, das ist das Einfügen, und indem du halt Punkt Pop0 machst.

Johannes

Das Problem darin ist, dass Pop 0 teuer ist.

Johannes

Weil das bedeutet, das erste Element der Liste wird entfernt.

Johannes

Das heißt, alle Elemente, die in der Liste drin sind, müssen um eins verschoben werden.

Johannes

Und das hört man jetzt schon, ja, dass wenn du das erste Element rausnehmen willst, musst du sie alle einmal anfassen.

Johannes

Und das ist natürlich für eine Operation, die sich so anhört wie das erste wegnehmen,

Jochen

einfach feuer.

Jochen

Unerwartet.

Johannes

Das ist diese Spezialimplementierung, der Deck, der Double-Ended Cue, wo das beides nicht viel kostet.

Johannes

Das Einfügen am Ende kostet nicht viel und das vorne wegnehmen kostet nicht viel.

Johannes

Dafür gibt es halt andere Operationen, die dann viel kosten.

Johannes

Dafür gibt es andere, dafür kannst du in der Mitte, wenn du in der Mitte was einfügen willst, das entweder geht es gar nicht oder es ist extrem langsam oder irgendwie solche Eigenschaften hast du dann da halt verloren.

Johannes

Die Sache an diesen Datenstrukturen ist halt, du kannst erstmal eine Liste verwenden und wenn das zu langsam wird oder wenn das Eigenschaften hat, wenn die Python-Liste Eigenschaften hat, die nicht gut genug sind, dann musst du dir was anderes suchen.

Johannes

Und das ist eigentlich dann die Antwort auf deine Frage.

Dominik

Ja, also wann merkst du aber nur überhaupt, dass die Liste nicht gut genug ist?

Dominik

Also weil es zu langsam wird, weil es dein Programm zu langsam gibt oder

Johannes

wenn dein Programm zu langsam ist und nicht mehr ein Speicher passt.

Ja, okay, also genau.

Johannes

Wenn dein Swap-Laufwerk anfängt zu arbeiten.

Dominik

Ja, oder die andere den Crash-Fall oben kickt.

Johannes

Ja, genau.

Johannes

Ja, oder wenn es halt zu langsam ist, ja.

Johannes

Also es gibt Fälle.

Johannes

Ich habe mit Leuten Sachen optimiert, die halt eine Liste wie ein Set verwendet haben und dann halt geguckt haben, ist dieses Objekt in dieser Liste drin, kannst du machen, wo überst du.

Die heißt IN.

Johannes

Und ist aber linear, ist O von N.

Johannes

Das heißt, du musst gucken, ist das erste Objekt mein gesuchtes Objekt oder das zweite oder das dritte oder das vierte.

Johannes

Das heißt, jede dieser Abfragen muss einmal alle potenziell alle Elemente anfassen.

Johannes

Und da gibt es eine Datestruktur, das Set, da ist es halt O von 1, da kostet es immer gleich viel, egal wie groß es ist, egal was du suchst, egal ob es drin ist oder nicht, kostet immer amortisiert gleich viel.

Johannes

Und wenn du so einen Algorithmus hast, der viele von diesen Operationen macht, dann hast du da eine Möglichkeit, den deutlich schneller zu machen.

Johannes

Und zwar richtig um Klassen schneller.

Dominik

Also wenn du

Dominik

einfach kurz ein Set aus der Liste und dann mache ich das N, den Innentest.

Jochen

Ja.

Johannes

In dem spezifischen Fall, genau, hat es ausgereicht, aus einer Liste ein Set zu machen und das hat schon, wenn du von O von N Quadrat auf O von N runtergehst, das macht Problemklassen bearbeitbar, die vorher nicht bearbeitbar waren.

Johannes

Vorher konnte man irgendwie 15 Elemente da drin haben und hinterher konntest du 15.000 Elemente drin haben.

Johannes

Also das ist einfach ein massiver Unterschied in der Performance.

Johannes

Aber vorher zu sagen, was du brauchst und an welchen Stellen das das Richtige ist, fällt mir sehr schwer.

Okay.

Dominik

Das heißt, man muss immer tatsächlich bei dem Problem gucken, was das jetzt bringt.

Genau.

Johannes

Du musst bei dem Problem diese Abwirkung machen zwischen Komfort und Geschwindigkeit.

Johannes

Und im ersten Schritt, das ist ja auch das, was wir vorhin angesprochen haben.

Johannes

Wir machen ja in erster Linie erstmal so einen Rapid-Prototype, einfach um zu sehen, ob es überhaupt.

Johannes

Und da wähle ich immer, wählst du immer die komfortabelste Lösung, die erste Lösung.

Johannes

Weil erst musst du wissen, ob das korrekt hinkriegst.

Johannes

Und dann kannst du gucken, ob das schnell hinkriegst.

Johannes

Ich kann sehr, sehr, sehr schnelle Programme schreiben, die nicht die richtige Antwort liefern.

Johannes

Das ist überhaupt gar kein Problem.

Jochen

Ja, aber wobei dann der, der, wenn ich jetzt mal meinen inneren Casey channeln darf, der würde natürlich sagen, ja, ja gut, also wenn du das jetzt so machst und wenn du halt implizit die Annahme triffst, dass du hinterher deine Hotspots, wo die Performance halt kritisch ist, halt optimieren kannst, dann kann es halt sein, dass du in einer Situation landest, wo du halt einem Pro-Filer deinen Code anguckst und der sagt dir halt, ja, also die ganze Performance geht drauf bei Funktionsaufrufen und bei Memory-Annotionen.

Jochen

Und du denkst dann, ja, wie soll ich denn jetzt noch optimieren?

Jochen

Dann wird er sagen, ha, siehst du.

Jochen

Das ist richtig.

Jochen

Das geht so nicht.

Aber, das ist richtig, aber

Johannes

Schritt null im Knurf Optimization Process ist die Wahl des richtigen Algorithmus.

Johannes

Das heißt, gucken, ob du den ob du den Algorithmus gewählt hast, der die richtigen Eigenschaften hat.

Johannes

Und das ist natürlich was, dass auch das ist schwierig, jetzt so konkret zu beantworten.

Johannes

Das ist halt was, was mit Erfahrung kommt, dass du weißt, welche Algorithmen gibt es und welche Sorten Algorithmen

Dominik

gibt es irgendwie schon.

Johannes

Ja, das ist so die witzige Umdrehung dieses Knuth-Zitats.

Johannes

Sag ich gleich.

Dominik

Also Primature Optimation ist es.

Johannes

Genau, das ist das, was mit der Erfahrung kommt, dass du weißt, welche Algorithmen gibt es, welche Alternativen gibt es, welche Datenstrukturen gibt es, was ist wo angebracht, wenn du jetzt irgendwie was anpassen musst oder wenn du jetzt irgendwas hast, was nicht auf ein Standardproblem passt, dass du es dir trotzdem aus den Bauteilen zusammensuchen kannst.

Johannes

Und der erste Schritt in diesem Prozess ist, den richtigen Algorithmus auszuwählen.

Johannes

Und alles andere ist untergeordnet.

Johannes

Wenn du den falschen Algorithmus auswählst, hast du schon verloren.

Johannes

Genau.

Johannes

Das bezieht sich auf dieses Zitat von Knuth: Premature Optimization is the root of all evil.

Dominik

Under wann weiß ich denn, ob dazu was richtig ist?

Johannes

Wobei, weißt du nicht.

Johannes

Wobei man auch dazu sagen muss, Knuth sagt ja im nächsten Satz: 10% Geschwindigkeitszuwachs lohnt sich schon zu optimieren.

Johannes

Und da sind wir natürlich auch hier auf der Python-Ebene haben wir schon verloren, weil wir akzeptieren, dass unsere Programme langsamer sind als das 10% Optimale.

Johannes

Auch da gibt es natürlich Ebenen.

Johannes

Knuth kommt ja aus einer ganz anderen Welt, wo die Prozessoren noch in Kilohertz gemessen wurden und nicht in Gigahertz.

Johannes

Und auch die, sag ich mal, die algorithmischen Probleme anders waren.

Johannes

Du kannst bei einem Sortieralgorithmus beweisen, was das Maximum ist, und du kannst beweisen, dass dein Algorithmus das Maximum für eine gewisse Datenklasse erreicht.

Johannes

Würde ich sagen, ist bei den meisten Sachen, die wir so bearbeiten, heutzutage, hier CV-Estellungen für den Jochen, kannst du nicht beweisen, dass du den optimalen Algorithmus ausgewählt hast.

Johannes

Du weißt, dass du einen Algorithmus ausgewählt hast, der passend ist für das Problem, wenn es deinen Anforderungen entspricht.

Johannes

Wenn du dein Problem lösen kannst in einer Zeit, die akzeptabel ist.

Johannes

Und das ist jetzt natürlich wieder so eine Stelle, wo der interne Casey sagt, ja, aber Moment mal, ich will einfach, dass das hier viel schneller wird.

Johannes

Und ich habe ausgerechnet, der Prozessor kann so und so viele Operationen pro Sekunde machen, also reicht es aus, um das 30 Mal pro Sekunde zu machen.

Johannes

Also kannst du es in Real-Time machen und dann mach's auch bitte in Real-Time.

Johannes

Und mein interner Nicht-Casey, der sagt dann halt, ja, aber einmal pro Sekunde reicht ja auch oder einmal pro fünf Sekunden reicht auch.

Johannes

So schnell muss man das gar nicht aktualisieren.

Johannes

Und das ist eine Frage der Anforderungen, welche Anforderungen du hast und welche Vorstellungen du hast und wie schnell du es haben willst.

Johannes

Und da pauschal zu sagen, was ist der richtige Rhythmus oder wie wählst du den aus?

Johannes

Keine Ahnung, ich weiß es nicht.

Johannes

Mit Erfahrung, mit Gefühl.

Johannes

Mit, ich weiß nicht.

Johannes

Mit dem Benutzer sprechen.

Wieder?

User Experience, ja, jetzt wird es aber wild.

Johannes

Ja, gut, okay.

Johannes

Also in Projekten natürlich nicht mit dem Benutzer, sondern mit dem, der es bezahlt.

Jochen

Ja, ja, okay, alles schlimm genug.

Jochen

Also, naja, gut.

Jochen

Oft ist es auch so, dass man gerne mal mit dem Benutzer dann sprechen würde, aber tatsächlich dann immer nur mit den Bezahlern, mit den Hippos.

Dominik

Ist ja immer noch so ein bisschen.

Johannes

Oft gibt es ja auch gar nicht den Benutzer, ja.

Johannes

Oft gibt es ja nur eine Klasse von Benutzern.

Johannes

Oder findest du gar nicht den Benutzer, sondern.

Jochen

Ja, oder oft vielleicht soll man gar nicht mit denen reden.

Johannes

Oder die Benutzer sind doof und verstehen es nicht.

Johannes

Das ist ja auch so manchmal.

Ja.

Johannes

Und was wir auch, also ich muss es jetzt gleich wieder zurücknehmen, ja.

Johannes

Ich meine, wir arbeiten ja oft in so einem Corporate-Umfeld und da sind die Benutzer halt.

Johannes

Das ist auch sowas, was Softwareentwickler oft sagen, das wäre alles so einfach, wenn die Benutzer nicht wären, wenn die nicht das falsch benutzen würden, wenn die das nicht so benutzen würden, wie sie es benutzen wollen.

Johannes

Das ist aber, das ist aber lustig, sowas im Bekanntenkreis zu sagen, aber wenn wir hier im Podcast sind, müssen wir das klarstellen.

Johannes

Das ist nicht ein Fehler des Benutzers, wenn er die Software falsch benutzt, sondern das ist ein Fehler der Software, dass die Software falsch benutzbar ist und wenn sie anders eingesetzt wird, als sie gedacht war.

Dominik

Deswegen fühle ich mich übrigens im Eurorex, obwohl, weil wenn man da das Kabel in die falsche Öse reinsteckt, dann kommen lustige Sachen raus und es gibt immer noch Musik.

Also für dich ist es ein Feature.

Johannes

Für dich soll das so sein.

Ja.

Dominik

Also ich würde mich aber auch nicht darüber beschweren, dass die Nutzer doof, sondern ich würde tatsächlich sagen, so, hey, super wichtig und toll, dass wir die Software benutzen.

Dominik

Hey, wenn dieser Bug für dich ein Feature ist, perfekt, I won't fix it.

Johannes

Ja, oft ist es ja andersrum.

Oft ist es ja so, dass du Feature kompliziert einbaust und dann sagen die Leute, ja, und dann liegt es halt nahe zu sagen, das liegt an dir,

Dominik

du doofer benutzt.

Dominik

Ja, man sollte halt vorher mal die Leute tragen, die es halt auch benutzen wollen, ob das halt wirklich das ist, was sie brauchen.

Johannes

Ja, und wenn eine Fehlbenutzung auftritt, also wenn tatsächlich Fehler auftreten, dadurch, dass die Benutzer irgendwas damit machen, dann muss die Software das halt entweder abkönnen oder korrigieren können, oder die Software muss die Benutzer so steuern, dass das nicht passiert.

Johannes

Die Benutzer können da nichts dafür, dass sie Anforderungen haben und dass sie Wünsche haben und dass sie.

Johannes

Das ist so eine generelle Einstellung, die man oft halt sieht in der Softwarewelt, der Computer hat Recht und der Benutzer hat nicht recht, aber es ist tatsächlich, dienen wir ja nicht den Computern, sondern es soll ja eigentlich schon andersrum sein.

Dominik

Mal gucken, wie lange noch.

Johannes

Deshalb sage ich, es soll andersrum sein.

Aber auch ich freue mich auf unsere Robotic Overlords und I41.

Ich möchte an der Stelle den Roboter

Johannes

sagen, ich bin ein Güterdiener.

Jochen

Genau.

Dominik

Er schreibt doch aber schon Danke bei Wenn GPT übrigens geschrieben.

Ja, natürlich.

Johannes

Natürlich.

Johannes

Bedankt ihr euch nicht bei ChatGPT.

Johannes

Das ist reiner Selbsterhaltungstreb für, wenn die Zukunft kommt.

Jochen

Dann werden die Protokolle gelesen und dann ausgewertet.

Dominik

Wer war denn nützlich?

Johannes

Wer war freundlich?

Johannes

Wie viel Freundlichkeit haben die verdient, diese Affen?

Jochen

Tja.

Johannes

Ja, okay, aber jetzt haben wir ja hier schon tatsächlich, sind wir schon relativ gut am Ende des Kapitels angekommen.

Johannes

Hier, Memory Views.

Johannes

NumPy wird hier noch erwähnt.

Johannes

NumPy finde ich ganz interessant, dass das hier in dem Kapitel über Sequences drin ist, weil NumPy selber ist ja keine Sequence.

Dominik

Ein Array?

Johannes

NumPy ist ja eine Riesenbibliothek mit ganz vielen numerischen Arbeiten.

Achso, du meinst ja, okay.

Johannes

Gut, aber die Datentypen, die da drin sind, die sind ja schon auf eine gewisse Art und Weise auch Sequences.

Johannes

Also die halten sich auch an das Sequence-Protokoll und da kannst du ganz viele, kannst du Slicing machen drauf und so weiter und so fort.

Dominik

Und die sind halt auch irgendwie näher und so.

Dominik

Was macht NumPy eigentlich so genauso besonders?

Dominik

Ja, also man kann mit NumPy auch was kaputt machen, ne?

Dominik

Also wirklich im Vergleich zu normalen Listen.

Dominik

Wenn du so eine Liste zu groß machst, dann passiert nicht so viel.

Dominik

Aber wenn du NumPy eine Liste irgendwie so groß machst, dann kannst du ja unten mit anscheinend.

Genau, du

Johannes

bist halt näher am Hauptspeicher dran.

Johannes

Dafür sind sie auch deutlich schneller.

Johannes

Also wenn du viele Einträge hast.

Johannes

Muss dich allerdings wieder auf den Datentyp festlegen.

Johannes

Du kannst nicht gemischte Datentypen haben.

Johannes

Dafür kannst du mehrdimensionale haben.

Johannes

Dafür kannst du, also es ist wieder so eine Abwägung.

Johannes

Aber auch das ist natürlich eine Möglichkeit, ja, dass du sagst, hier, wir haben irgendwelche Daten, die wir verarbeiten müssen, dann nehmen wir doch NumPy-Datentypen.

Johannes

Und ganz viele Bibliotheken integrieren das ja auch.

Johannes

Also zum Beispiel bei Pillow kannst du einfach sagen, hier erst irgendwas und dann kriegst du eine NumPy-Array raus.

Johannes

Wenn du irgendwelche Bildfilter selber schreiben willst oder wenn du irgendwelche.

Johannes

Ja, ich habe mal Dithering gemacht für ein Privatprojekt.

Johannes

Und das habe ich halt auf den NumPy Arrays.

Dominik

Dithering.

Johannes

Das ist das Schönste, was du da

machen kannst.

Dominik

Kanten finden.

Johannes

Dithering ist, wenn du von einem Bildformat mit vielen Farben dich bewegst auf ein Bildformat mit wenigen Farben, dann hast du üblicherweise Fehler in deinem Bildrecht.

Dominik

Ja, dann musst du immer Zusammenfassung machen, da musst du mit so einem Raster drüber laufen und das dann irgendwie Mitteln oder so.

Genau, und das heißt Dithering.

Johannes

Das heißt, du hast den Fehler nicht an der, an dieser einen Stelle, sondern du verteilst ihn und dann wirkt das Bild besser auf Menschen.

Johannes

Das sieht besser aus und macht halt, verteilt so ein bisschen die, also du hast dann bessere, das Bild sieht besser aus mit weniger Farbe.

Johannes

Und ich habe das, ich mag ja E-Paperscreens sehr gerne und ich habe mir eben so eine Anwendung gemacht, wo ich Bilder auf E-Paperscreens machen kann und dann musst du Dithering machen, weil die haben üblicherweise vier Graustufen oder acht Graustufen oder 16 Graustufen.

Johannes

Und da kommst du nicht drum, dann musst du Dithering machen, sonst hast du so ganz blockige Bilder mit harten Kanten drin, die bescheuert ausschauen.

Johannes

Ja, aber wie gesagt, also NumPy integriert sich da ja in ganz viele Sachen rein und ist halt einfach, man kann ja diese zusätzliche Funktionalität kannst du einfach ignorieren, kannst du aber sagen, okay, ja, die gibt es, aber brauche ich jetzt gerade nicht.

Ja.

Jochen

Ja, voll gut, voll gut.

Jochen

Ich überlege halt nicht nur irgendwie, was ich das hatte, was irgendwie unbedingt drin, aber ich glaube, nee.

Dominik

Naja, dann sind wir ja quasi tatsächlich mit dem Thema Listen durch.

Dominik

Dann können wir das nächste Mal ja weitermachen.

Dominik

Wir werden sehen, ob wir wollen.

Missionaries and Sets.

Dominik

Wir wollten aber auch noch 3-13 machen und wir wollten ein Patamatchen machen und wir wollten Maschinen und wir machen.

Jochen

Oh ja.

Johannes

Schreibt in den Kommentaren, was ihr überhaupt wollt.

Ja, genau.

Ja.

Jochen

Ja, ja, ja, ja.

Jochen

Oh, genau, und vielleicht haben wir auch noch Picks.

Jochen

Also ich hätte einmal.

Natürlich haben wir Picks.

Johannes

Du hast einen Jochen, ich habe den gleichen wie du.

Jochen

Bist du sicher?

Ja, sag du mal.

Jochen

Also wenn man sich ja, ich meine, genau, in letzter Zeit immer mehr mit LLMs unterhält und so, dann manchmal stellt man.

Jochen

Stellt man stellt man sich ja manchmal die Frage, so irgendwie ist das, was ich hier mache, eigentlich ein toller Blödsinn oder geht das irgendwie schon okay?

Jochen

Und da war das hilfreichste Dokument, was ich bisher so dazu gelesen habe, ob jetzt was, was so Pompt-Techniken und so angeht und was man da so machen kann, ist tatsächlich das Enthropic Prompting Guide, der ist wirklich gut.

Dominik

Tatsächlich, fand ich aber auch gut, dass jemand wie Entropic seinen eigenen Guide dazu auf Public rausgibt.

Dominik

Das fand ich so ein Bemerkenswert.

Ja.

Jochen

Den wollte ich mal picken, weil.

Jochen

Also nicht, dass man, also ich sehe das manchmal, wenn ich dann irgendwie ein wie wird es das jetzt immer genannt, irgendwie die Nazi-Bar oder die Hellzeit oder weiß ich nicht, wie Twitter gucke, dann wird mein Timeline überschwemmt von irgendwie die zehn besten Prompting-Tipps und hier nur sieben Dinge, die du nicht gewusst hast, dass du das mal einfach nur machen musst.

Johannes

You won't believe what happens next.

Ja, genau.

Jochen

Gut, da sind manchmal auch brauchbare Tipps dabei, aber man muss halt auch viel Müll lesen und naja, also Entropic Prompting Guide viel besser.

Johannes

Okay.

Johannes

Cool.

Johannes

Jochen, ich dachte, du pickst UV.

Johannes

Das ist nämlich mein erster Pick, diese Episode.

Jochen

Okay, ja.

Johannes

UV ist was ganz, ganz komisches.

Johannes

UV ist ein Package Manager für Python, aber geschrieben in Rust.

Dominik

Moment, haben wir UV nicht schon fünfmal gepickt?

Jochen

Nee, gepickt weiß ich nicht, aber wir haben auf jeden Fall schon mal darüber geredet, aber gepickt noch nicht, glaube ich.

Wirklich nicht.

Johannes

Ich pick das, ich pick das heute, weil es ist mir wieder begegnet und ich muss es jetzt endlich mal ausprobieren.

Dominik

Und tatsächlich, also ich bin auch kurz vor, das wirklich einzuführen, weil ich habe es jetzt noch ein bisschen ausprobiert.

Dominik

Es haben die Features, die vor einem Jahr mir noch gefehlt haben, die sind jetzt drin, es funktioniert, es läuft.

Dominik

Es läuft mit der Pi-Projekt, so wie ich es mir vorstelle.

Dominik

Und ich werde Pulpway rausschmeißen, Juve einführen.

Dominik

Wahrscheinlich.

Johannes

Und es ist schneller.

Dominik

Ja, genau.

Dominik

Das ist tatsächlich also wirklich schneller.

Johannes

Da freut sich der interne Casey Moratory.

Jochen

Ja.

Jochen

Also ich habe auch jetzt zum ersten Mal das verwendet, um jetzt bei dem, wo ich es nicht vermeiden konnte, auf New Project zu klicken, habe ich gesagt, das ist nämlich doch mal ein Juve, weil ich Spabet mal aufgeht.

Das ist auch eine Gelegenheit.

Jochen

Genau, es ist immer eine Gelegenheit.

Jochen

Und ja, ich bin auch, vor allen Dingen, es ist in den letzten Zeit, also in den letzten zwei Monaten sind da eine Menge neue Features gekommen, sozusagen, die man tatsächlich brauchen kann.

Jochen

Und die halt auch diese ganzen Sachen abdecken, die vorher halt, wo ich mir dachte, ah nee, so ganz geht's noch nicht.

Jochen

Und es gab jetzt auch einen langen Thread auf, den verlinke ich auch mal, auf im Fiddiverse, wo sich so die Leute, die sich mit Packaging beschäftigen, einmal drüber unterhalten, und wo auch diese große Frage, ich meine, sage so, naja gut, also ich meine, Venture Capital ist halt so ein Problem.

Jochen

Was passiert jetzt eigentlich, wenn die Investoren halt sagen, so, okay, jetzt haben wir schon die ganze Zeit so viel Geld gegeben, jetzt würden wir auch mal wieder gerne welches Thema.

Wollen wir auch mal wieder welche?

Jochen

Und was passiert denn denn eigentlich?

Jochen

Und ja, also dieser Chat ist ja sehr aufschlussreich, auch, also was mich zum Beispiel tatsächlich gefreut hat, ist, dass da viele Leute geschrieben haben, so, ja gut, okay, dann forten wir das halt.

Jochen

Und wenn sie jetzt immer die Bedenken kommen, das wird da nicht gemaintained oder so, also ehrlich gesagt, das irgendwie weiter zu maintain, ich habe mir den Code angeguckt, das weiter zu maintain, ist weniger Arbeit, als irgendwie, weiß ich nicht, den Pip-Code irgendwie zu maintain, den ich sowieso schon maintaine und das ist irgendwie doof.

Jochen

Also das ist schon okay.

Jochen

Und also wenn da ein paar Leute sagen, okay, nee, das ist schon gut.

Jochen

Und wir würden das auch weiter maintainten, wenn da, wenn das irgendwie dem Wach runter geht, sonst businessseitig, dann hab ich da auch schon mehr Hoffnung, dass das vielleicht auch bleibt.

Ja.

Johannes

Hat ihr wie Venture Capital genommen?

Ja.

CD kapitalfinanziert?

Johannes

Das ist ja witzig.

Johannes

In den letzten Jahren gab es so ein paar Pro-Projekte, von denen ich gedacht habe, das ist ja weird.

Johannes

Jetzt UV ist so eins, wo ich mir denke, ist das wirklich was, womit du Venture Capitalists ansprichst?

Dominik

Rough und so hat er auch funktioniert, das ist derselbe Firma.

Ja, selbe Firma, genau.

Und es gibt das irgendwie.

Dominik

Und dann der Armin Ronacher macht er auch da hin, ne?

Jochen

Der aber der arbeitet fest bei Sunfree.

Dominik

Ja, aber trotzdem, also macht er viele Sachen da geteilt mit den Leuten von IV.

Jochen

Genau, genau.

Johannes

Der hat bei Evangelist, oder?

Der darf doch machen, was er will.

Jochen

Ja, kann sein.

Jochen

Aber nee, der hat das war auch einer von den Leuten, der hat auch in dem Sweat da mitgeschrieben und meinte, so, ja, also Rai hat ja vorher geschrieben, nee, die sollen das Bruch mal machen, die machen das schon besser und das ist wunderbar alles.

Jochen

Und dachte ich, ja gut, okay, wenn du das hast.

Jochen

Aber nee, genau, also das Textual oder der, wie heißt er, Will McDerich geschrieben hat, der hat auch ein Venture Capital genommen für

Dominik

CLI, also das ist tatsächlich gar nicht so schlecht, in der CLI so ein Maus-Clickable und also mit Tastatur-UI hat zu haben.

Dominik

Das sieht halt so ein bisschen aus wie so ein richtiges Interface in der CLI.

Jochen

Taxi.

Jochen

Und Pydentic hat halt auch jede Menge Venture Capital genommen.

Ja, gut, also ich habe gerne die, würde ich gerne mal sehen, wie sie das wieder raushören.

Aber gut, das werden wir ja dann alle sehen.

Jochen

Das werden wir alle sehen, das werden wir alle spüren, das werden wir alle an unseren Daumen spüren.

Jochen

Hoffentlich werden das werden die Schrauben nicht zu spitz sein, die sie uns da reindrehen.

Jochen

Aber es wird also ich bin gespannt.

Dominik

Also kann ich auch durchaus sofort, ich würde sagen, das ist tatsächlich so die Lösung für Python-Packaging-Probleme, auf die wir lange gewartet haben.

Also jetzt ohne mich so weit aus dem

Jochen

Fest zu zeigen.

Jochen

Auch für mich ist, also das ersetzt jetzt tatsächlich alles das, was Piptools sonst macht.

Jochen

Und ja, wenn es das gleiche macht wie Piptools und es ist schneller, naja gut, dann.

Dominik

Ja, genau.

Dominik

Bei mir ist halt zwei Putries weg.

Dominik

Kommt UV rein und dann musst du noch in die, genau, gleichen.

Johannes

Genau, dann ist es doch ein guter Pick.

Johannes

Aber ich habe noch einen zweiten.

Noch einen.

Johannes

Ich halte das mal hier in die Kamera, ihr Zuhörer

könntest du.

Dominik

The nature of Code.

Johannes

Ich habe hier The Nature of Code.

Johannes

Okay.

Johannes

Simulating Natural Systems with JavaScript.

Johannes

Ich weiß, es ist JavaScript und es ist schade, dass es JavaScript ist, aber es gibt eine Python-Adaptierung davon von Daniel Stiffman.

Johannes

Da ist jetzt am 3.

Johannes

September die zweite Auflage herausgekommen.

Johannes

Und da gibt es auch eine Videoserie dazu.

Johannes

Der Daniel Schiffman, der ist Professor, ich glaube in New York, an irgendeiner Universität und der macht auch regelmäßige Videostreams.

Johannes

Der benutzt P5.js.

Johannes

Das ist eine Variante von Processing.

Johannes

Also es ist quasi Processing in JavaScript.

Johannes

Da gibt es auch tatsächlich, es gibt auch Pi 5, heißt es, glaube ich.

Johannes

Das ist die Python-Variante, die genauso ist.

Johannes

Und er erklärt einfach JavaScript-Programmierung anhand von so Simulationsbeispielen, anhand von, hier ist jetzt mal ein Punkt.

Johannes

Jetzt, wie können wir dafür sorgen, dass der sich bewegt?

Johannes

Und wie können wir dafür sorgen, dass der sich hübsch bewegt?

Johannes

Und wie können wir dafür sorgen, dass der irgendwie lustige Bewegungen macht?

Johannes

Und am Ende von jedem Kapitel ist noch eine Aufforderung, hier probier doch mal hier folgende Dinge damit zu simulieren.

Johannes

Und probier doch mal was aus, probier, was passiert, wenn du diesen, das und jenes veränderst.

Johannes

Das ist in den ersten Kapiteln, also ich habe jetzt hier so ungefähr ein Sechstel durch.

Johannes

Es ist sehr basic.

Johannes

Sehr, ja, das hier ist eine Variable und das hier ist ein Array und das ist eine.

Johannes

Und hier kannst du eine Methode aufrufen.

Was ist überhaupt eine Methode?

Johannes

Und nicht vergessen, this bedeutet immer das aktuelle Objekt und so.

Johannes

Das wird, glaube ich, in den späteren Kapiteln auch deutlich interessanter, weil da habt ihr Videos gesehen.

Johannes

Und da kommen doch spannende Dinge zutage, die man damit machen kann.

Johannes

Aber es ist eben sehr spielerisch.

Johannes

Es ist sehr, du siehst immer was, es bewegt sich immer was, es ist immer mausklickbar und es ist immer irgendwie anschaubar.

Johannes

Und das gefällt mir sehr gut.

Johannes

Das ist eine sehr gute Technik, wie man immer was hat, was interessant ist.

Johannes

Und nicht nur.

Dominik

Ja, ich erinnere mich an die Steuerung.

Dominik

Das klingt danach, als vielleicht schon ein Punkt ist.

Johannes

Deshalb ist das mein zweiter Pick: The Nature of Code von Daniel Schiffman.

Johannes

Gerade neu rausgekommen, auch wundervolles Cover mit einer brillanten rosafarbenen

Dominik

Einband hier.

Dominik

Okay.

Johannes

Klick auch innen drin, das ist ja schön hier, dass die Innenseite des Einbands führt dieses Muster fort, das finde ich sehr schön.

Jochen

Ah, hervorragend.

Jochen

Ja, was mir da noch ganz kurz zu einfällt, ist, ich habe letztens eine Podcast-Episode gehört mit, na, wie heißt er noch?

David Crockford, der JavaScript.

Jochen

Der viel mit JavaScript gemacht hat und der auch da irgendwie das eines der besten Bücher da geschrieben hat, das irgendwie relativ knackig und kurz ist.

Jochen

Und der, ach genau, der auch sich den JSON-Standard ausgedacht hat und so.

Jochen

Der, ich wusste gar nicht, wie hartnäckig die XML-Crowd an der Stelle irgendwie angepisst war davon.

Jochen

Aber der meinte, er hat wirklich Todesdrogen gekriegt von Leuten aus der XML-Community.

Jochen

Und war da auch nicht so richtig amüsiert drüber.

Dominik

Links, links, bitte.

Jochen

Ja, den Podcast verlinke ich gerade.

Jochen

Aber der hat nämlich dann nebenher noch was anderes Interessantes gemacht, nämlich dann dann, also einmal, also auch ansonsten mal so ein paar sehr coole Aussagen dabei, sowas wie, naja, also, also wurde dann gefragt, so, wie ist das ein TypeScript, ist das irgendwie eine sinnvolle Weiterentwicklung von, und ist das gut und so?

Jochen

Und er war so, ja, also wenn es irgendwie den .NET-Entwicklern das irgendwie einfacher macht, irgendwie, dass sie da jetzt JavaScript schreiben müssen, dann ist das wohl okay.

Jochen

Also ich brauche das jetzt nicht, aber okay.

Jochen

Naja, der hatte so eine interessante Hobby-Geschichte und er zwar meinte, er interessiert sich eigentlich sehr stark für Mathematik und so.

Jochen

Aber jetzt nicht so für die komplizierten Sachen, sondern so die einfachen, basic-Geschichten, der findet die voll toll.

Jochen

Und deswegen, weil er findet, diese Teile der Mathematik kriegen immer irgendwie zu viel zu wenig Liebe ab.

Jochen

Und deswegen gibt es so komische Sachen, wie zum Beispiel meinte, also wisst ihr eigentlich, was eine Hypotenuse ist oder so?

Jochen

Und wisst ihr, wie man das schreibt?

Jochen

Und so, also, keine Ahnung, ja, also, das weiß tatsächlich kaum jemand, aber dabei ist das total wichtig.

Jochen

Also, auch so gerade für so ganz einfache Sachen.

Jochen

Das ist halt die lange Seite in einem Dreieck.

Ja, warum nennen wir das nicht einfach?

Ein rechtwinkligen Dreieck.

Jochen

Ja, also ich meine, natürlich gibt es auch Dreiecke, die haben, das sind die Seiten gleich lang und so, aber warum nennen wir das nicht einfach die lange Seite?

Jochen

Das wäre viel einfacher.

Jochen

Wenn das immer Hypotenuse nennen, das ist einfach.

Johannes

Wenn es nicht Griechisch ist, ist nicht cool genug.

Jochen

Ja, genau, es ist nicht cool genug, aber es verwirrt halt viele Leute und schreckt halt ab.

Jochen

Und eigentlich ist es aber irgendwie gar nicht so schwierig.

Jochen

Ja, und er nannte das, dieses Gebiet, was er da, mit er sich da beschäftigt hatte, Lower Mathematics.

Jochen

Im Gegensatz zu den Higher Mathematics.

Jochen

So großartig.

Jochen

Da gibt es ganz viel Craft, der sich so über die Jahrhunderte angesammelt hat, das kann man eigentlich alles mal wegmachen.

Das ist dann endlich.

Dominik

Nieder mit den Griechenholt.

Johannes

Ja, aber und es gibt auch ganz viele Notationssachen und ganz viele so Benennungssachen, die Lateien.

Johannes

Ja, und die auch die Didaktik einfach kaputt machen.

Dominik

Nur weil du den höheren Sinn davon noch nicht verstanden hast, Johannes.

Johannes

Genau, weil du die Higher Mathematics, weil wir haben das lernen müssen.

Johannes

Dann müssen die jungen Leute das heute auch lernen und es ist mir scheißegal, ob das nicht ist oder nicht.

Dominik

Okay, okay, na gut.

Dominik

Also ich tippe natürlich wieder was Unsinniges.

Dominik

Und zwar schönen Tipp bekommen.

Dominik

Ihr wisst ja, ich mache Musik, mag eine Rechnung mit die DRW Bespoke geschickt.

Dominik

Und zwar Bespoke Syns.com, das ist ein kommerzielles Produkt auch.

Dominik

Also eine DRW, also eine digitale Audio-Workstation, mit der man Live-Coding machen kann für Musik, was Python Live-Coding-Access so gibt, was eigentlich sehr nice ist, wenn man so ein bisschen Modular mag oder Musik machen mag.

Dominik

Und da kann man seine einzelnen Syns und Instrumente und Filter und sowas in Kette schalten, die alle über den Interpreter coden und sich da Funktionen für bauen und so.

Das sieht ganz nice aus, finde ich.

Jochen

Ah, hast du eigentlich den Vortrag von Lukas Langer auf der EuroPython?

Dominik

Ja, ich war live da, weil das natürlich geil war, weil er hat auch sein Modular-Ding mitgenommen.

Dominik

Ich habe ihn da vorher ein bisschen belästigt, hab mir das ein bisschen angeguckt, ich bin bequatscht und er hatte noch einige andere nette Sachen da rumstehen, die schließen.

Jochen

Das, was viele Leute nicht verstanden haben, ist, dass das auch nur funktioniert hat, so wie das mit quasi No-Gil-Free-Threading und dass es halt ein Showcase dafür war.

Jochen

Und dass es irgendwie keiner verstanden hat und der war so ein bisschen enttäuscht, dass das irgendwie nicht so richtig war.

Dominik

Ja, also die Leute haben einfach gedacht, das macht halt irgendwie Musik, aber das macht tatsächlich deswegen ganz gut möglich.

Dominik

Aber ja, also das war tatsächlich einer der Punkte, wo ich auch sagen würde, dass das so Live-Coding macht damit schon sehr viel Spaß.

Dominik

Er hat halt dann die Sachen auch alle vorbereitet, ne?

Dominik

Das war mit dem neuen REPL von 3.13 auch genommen.

Jochen

Er hat auch die neue REPL und hatte da so lustige Dinge, dass er halt dieses Schaut.

Dominik

Und er konnte halt auf einen Knopfdruck das Bild von Comic einbilden.

Dominik

Das war auch sehr geil, dem du Menschen, von dem du auch schon ein paar Mal geschämt hast.

Genau.

Dominik

Ja, es war ziemlich lustig und ja, aber er hat mit dem Euroreck, also für meine Fälle ist halt relativ wenig gemacht.

Dominik

Er hat halt einmal seine Sinnstimme vorher eingestellt, out of Theater und das hat halt schöne Musik gemacht und er hat halt ein bisschen getriggert.

Dominik

War halt eigentlich nur ein Instrument, was dann ein paar Töne gespielt hat.

Dominik

Und die Töne hat er aber halt dann gar nicht mehr.

Dominik

Also er hat ja dann ein bisschen generieren lassen aus der Thronleiter aus dem Python-Interpreter.

Dominik

Ich glaube, er hat ja welches, ich weiß gar nicht mehr, welche Lib er genommen hat.

Irgendwas Cooles mit MIDI-Access.

Und er hat über MIDI Sachen halt angesteuert über so ein MIDI-Gate.

Dominik

Ja, aber es gibt dieses andere, die Spokes sind ganz cool aus.

Dominik

Ich habe es aber noch nicht selber ausprobiert, aber das steht auf meiner Liste und ich muss es unbedingt gerne tun, weil Synthesizer und so.

Gibt's auch.

Dominik

Ja, ist auch ein tiefes Gefeld.

Dominik

Falls jemand morgen Board auf Löten hat.

Ich kann morgen löten.

Dominik

Module bauen.

Das Löteste.

Dominik

Tatsächlich ein USB-Modul von dem Stefan.

Egal, SCP-B.

SC-Modul vom Stefan.

Dominik

Ja, SC-Modular.

Jochen

Wo gehst du löten?

Dominik

Bei in so einer Kollektiv?

Dominik

Es gibt ja so Hacker-Kollektive, es gibt so Musikkollektive und so und ja, machen wir ein bisschen Musik und dann modulare Sachen.

Und dann wird gelötet.

Dominik

Genau, ja, weil ich habe so ein paar Module und bei so einem Elektronik.

Dominik

Das ist wöchentlich, wenn man einmal anfängt, mit diesem ganzen Quatsch und dann Widerstände in Tausender Packs und so.

Ja.

Dominik

Schön.

Johannes

Man kann die auch in den 100er Packs kaufen, die kosten genauso viel wie die 1000er Packs.

Ja, genau.

Ich glaube, ich brauche eine Sache.

Johannes

13er Packs kaufen, die heißen so viel wie die 100er Packs.

Ja, du kennst dich aus.

Ja, tatsächlich.

Ja, okay.

Dominik

Ich wollte nur kurz abschweifen.

Dominik

Ja, voll gut.

Dominik

Ja, also herzlichen Dank fürs Zuhören und dafür, dass ihr dabei wart.

Dominik

Und schreibt beim nächsten Mal wieder rein.

Dominik

Feedback und Kritik und Liebe und so alles an hallo.pythonpodcast.de.

Genau.

Und bleibt uns gebogen.

Dominik

Vielen Dank, Johannes.

Johannes

Ich danke euch allen.

Vielen Dank.

Bis bald.

Bis zum nächsten Mal.

Ciao, ciao.