{"id":16496,"date":"2024-12-09T19:51:44","date_gmt":"2024-12-09T16:21:44","guid":{"rendered":"https:\/\/www.itpiran.net\/blog\/?p=16496"},"modified":"2024-12-09T19:51:44","modified_gmt":"2024-12-09T16:21:44","slug":"boosting-python-scripts-cython","status":"publish","type":"post","link":"https:\/\/www.itpiran.net\/blog\/de\/tutorials\/boosting-python-scripts-cython\/","title":{"rendered":"Python-Skripte mit Cython verbessern"},"content":{"rendered":"<h2 id=\"%d9%85%d9%82%d8%af%d9%85%d9%87\">Einf\u00fchrung<\/h2>\n<p>Python mag zwar eine der beliebtesten Programmiersprachen heutzutage sein, aber sicherlich nicht die effizienteste. Gerade im Bereich des maschinellen Lernens opfern Anwender die Effizienz zugunsten der Benutzerfreundlichkeit von Python.<\/p>\n<p>Das hei\u00dft aber nicht, dass man die Sache nicht auch auf anderem Wege beschleunigen kann. Cython ist eine einfache M\u00f6glichkeit, die Rechenzeit von Python-Skripten zu reduzieren, ohne dabei auf die Funktionalit\u00e4t zu verzichten, die sich mit Python problemlos realisieren l\u00e4sst.<\/p>\n<p>Dieses Tutorial f\u00fchrt Sie in die Verwendung von Cython zur Beschleunigung von Python-Skripten ein. Wir widmen uns einer einfachen, aber rechenintensiven Aufgabe: der Erstellung einer for-Schleife, die eine Python-Liste mit einer Milliarde Zahlen durchl\u00e4uft und diese summiert. Da Zeit bei der Ausf\u00fchrung von Code auf ressourcenbeschr\u00e4nkten Ger\u00e4ten entscheidend ist, untersuchen wir dieses Problem anhand der Implementierung von Python-Code in Cython auf einem Raspberry Pi (RPi). Cython bewirkt einen signifikanten Unterschied in der Rechengeschwindigkeit; vergleichbar mit dem Unterschied zwischen Lazy Loading und Yozo.<\/p>\n<h2 id=\"%d9%be%db%8c%d8%b4%d9%86%db%8c%d8%a7%d8%b2%d9%87%d8%a7-%d8%a8%d8%b1%d8%a7%db%8c-%d8%a8%d9%87%db%8c%d9%86%d9%87%d8%b3%d8%a7%d8%b2%db%8c-%d8%a7%d8%b3%da%a9%d8%b1%db%8c%d9%be%d8%aa\">Voraussetzungen f\u00fcr die Optimierung von Python-Skripten mit Cython<\/h2>\n<ul>\n<li>Grundkenntnisse in Python: Vertrautheit mit der Python-Syntax, Funktionen, Datentypen und Modulen.<\/li>\n<li>Grundlegende C\/C++-Konzepte verstehen: Vertrautheit mit grundlegenden C- oder C++-Konzepten wie Zeigern, Datentypen und Kontrollstrukturen.<\/li>\n<li>Python-Entwicklungsumgebung: Installieren Sie Python (vorzugsweise Python 3.x) mit einem Paketmanager wie pip.<\/li>\n<li>Cython installieren: Installieren Sie Cython mit dem Befehl pip install cython.<\/li>\n<li>Terminal-\/Befehlszeilenkenntnisse: Grundlegende F\u00e4higkeit zur Navigation und Ausf\u00fchrung von Befehlen in einem Terminal oder einer Befehlszeile.<\/li>\n<\/ul>\n<p>Diese Voraussetzungen helfen Ihnen dabei, sich auf die Optimierung von Python-Code mit Cython vorzubereiten.<\/p>\n<p><a href=\"https:\/\/cdn.itpiran.net\/2024\/12\/09183840\/1.png\"><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"576\"  height=\"262\"  class=\"aligncenter wp-image-16498 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 576px) 100vw, 576px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/12\/09183840\/1.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/12\/09183840\/1.png 576w, https:\/\/cdn.itpiran.net\/2024\/12\/09183840\/1-300x136.png 300w, https:\/\/cdn.itpiran.net\/2024\/12\/09183840\/1-110x50.png 110w, https:\/\/cdn.itpiran.net\/2024\/12\/09183840\/1-200x91.png 200w, https:\/\/cdn.itpiran.net\/2024\/12\/09183840\/1-380x173.png 380w, https:\/\/cdn.itpiran.net\/2024\/12\/09183840\/1-255x116.png 255w, https:\/\/cdn.itpiran.net\/2024\/12\/09183840\/1-550x250.png 550w\" ><\/a><\/p>\n<h2 id=\"%d9%be%d8%a7%db%8c%d8%aa%d9%88%d9%86-%d9%88-%d8%b3%db%8c%d9%be%d8%a7%db%8c%d8%aa%d9%88%d9%86\">Python und CPython<\/h2>\n<p>Vielen ist nicht bewusst, dass Programmiersprachen wie Python auch in anderen Sprachen implementiert sind. Die C-Implementierung von Python hei\u00dft beispielsweise CPython. Diese ist nicht mit Cython zu verwechseln. Weitere Informationen zu den verschiedenen Python-Implementierungen finden Sie in diesem Artikel.<\/p>\n<p>Die Standard- und beliebteste Implementierung von Python ist C-Python. Die Verwendung von C bietet einen wichtigen Vorteil: C ist eine kompilierte Sprache, deren Code in Maschinencode \u00fcbersetzt und direkt von der Zentraleinheit (CPU) ausgef\u00fchrt wird. Nun k\u00f6nnte man sich fragen: Wenn C eine kompilierte Sprache ist, bedeutet das, dass Python dasselbe ist?<\/p>\n<p>Die Python-Implementierung in C (CPython) 100% wird weder kompiliert noch interpretiert. Tats\u00e4chlich finden Kompilierung und Interpretation erst w\u00e4hrend der Ausf\u00fchrung eines Python-Skripts statt. Um dies zu verdeutlichen, betrachten wir die einzelnen Schritte der Ausf\u00fchrung eines Python-Skripts:<\/p>\n<ol>\n<li>Kompilieren von Quellcode mit CPython zur Erzeugung von Bytecode<\/li>\n<li>Bytecode-Interpretation durch den CPython-Interpreter<\/li>\n<li>Die Ausgabe des CPython-Interpreters in der virtuellen CPython-Maschine ausf\u00fchren<\/li>\n<\/ol>\n<p>Der Kompilierungsprozess findet statt, wenn CPython den Quellcode (die .py-Datei) kompiliert und CPython-Bytecode (die .pyc-Datei) erzeugt. Dieser Bytecode wird anschlie\u00dfend vom CPython-Interpreter interpretiert und die Ausgabe in der CPython-VM ausgef\u00fchrt. Wie die obigen Schritte zeigen, umfasst die Ausf\u00fchrung eines Python-Skripts sowohl die Kompilierung als auch die Interpretation.<\/p>\n<p>Der CPython-Compiler erzeugt Bytecode nur einmal, der Interpreter wird jedoch bei jeder Codeausf\u00fchrung aufgerufen. Die Interpretation von Bytecode ist in der Regel zeitaufwendig. Wenn die Verwendung eines Interpreters die Ausf\u00fchrung verlangsamt, warum sollte man ihn dann \u00fcberhaupt einsetzen? Der Hauptgrund ist, dass der Interpreter Python auf verschiedenen Betriebssystemen nutzbar macht. Da der Bytecode unabh\u00e4ngig vom jeweiligen Rechner in der CPython-VM, die auf der CPU l\u00e4uft, ausgef\u00fchrt wird, kann er ohne \u00c4nderungen auf unterschiedlichen Rechnern ausgef\u00fchrt werden.<\/p>\n<p><a href=\"https:\/\/cdn.itpiran.net\/2024\/12\/09184025\/2.png\"><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"576\"  height=\"654\"  class=\"aligncenter wp-image-16499 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 576px) 100vw, 576px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/12\/09184025\/2.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/12\/09184025\/2.png 576w, https:\/\/cdn.itpiran.net\/2024\/12\/09184025\/2-264x300.png 264w, https:\/\/cdn.itpiran.net\/2024\/12\/09184025\/2-110x125.png 110w, https:\/\/cdn.itpiran.net\/2024\/12\/09184025\/2-200x227.png 200w, https:\/\/cdn.itpiran.net\/2024\/12\/09184025\/2-380x431.png 380w, https:\/\/cdn.itpiran.net\/2024\/12\/09184025\/2-255x290.png 255w, https:\/\/cdn.itpiran.net\/2024\/12\/09184025\/2-300x341.png 300w, https:\/\/cdn.itpiran.net\/2024\/12\/09184025\/2-550x624.png 550w\" ><\/a><\/p>\n<p>Wird kein Interpreter verwendet, erzeugt der CPython-Compiler Maschinencode, der direkt auf der CPU ausgef\u00fchrt wird. Da verschiedene Plattformen unterschiedliche Befehle verwenden, ist der Code nicht auf allen Plattformen lauff\u00e4hig.<\/p>\n<p><a href=\"https:\/\/cdn.itpiran.net\/2024\/12\/09184215\/3.png\"><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"576\"  height=\"390\"  class=\"aligncenter wp-image-16500 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 576px) 100vw, 576px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/12\/09184215\/3.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/12\/09184215\/3.png 576w, https:\/\/cdn.itpiran.net\/2024\/12\/09184215\/3-300x203.png 300w, https:\/\/cdn.itpiran.net\/2024\/12\/09184215\/3-110x74.png 110w, https:\/\/cdn.itpiran.net\/2024\/12\/09184215\/3-200x135.png 200w, https:\/\/cdn.itpiran.net\/2024\/12\/09184215\/3-380x257.png 380w, https:\/\/cdn.itpiran.net\/2024\/12\/09184215\/3-255x173.png 255w, https:\/\/cdn.itpiran.net\/2024\/12\/09184215\/3-550x372.png 550w\" ><\/a><\/p>\n<p>Kurz gesagt: Ein Compiler beschleunigt den Prozess, aber der Interpreter macht den Code plattform\u00fcbergreifend. Einer der Gr\u00fcnde, warum Python langsamer als C ist, liegt also in der Verwendung des Interpreters. Der Compiler wird nur einmal ausgef\u00fchrt, der Interpreter hingegen bei jeder Codeausf\u00fchrung.<\/p>\n<p>Python ist deutlich langsamer als C, wird aber von vielen Programmierern dennoch bevorzugt, da es wesentlich einfacher zu bedienen ist. Python verbirgt viele Details vor dem Programmierer, was frustrierendes Debuggen verhindern kann. Da Python beispielsweise eine dynamisch typisierte Sprache ist, muss der Typ jeder Variablen im Code nicht explizit angegeben werden \u2013 Python leitet ihn automatisch ab. Im Gegensatz dazu m\u00fcssen in statisch typisierten Sprachen (wie C, C++ oder Java) die Variablentypen explizit angegeben werden, wie unten gezeigt.<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-c\" data-lang=\"C\"><code>int x = 10\r\nstring s = \"Hello\"<\/code><\/pre>\n<\/div>\n<p>Vergleichen Sie mit der folgenden Implementierung in Python:<\/p>\n<p>Dynamische Typisierung vereinfacht zwar das Programmieren, belastet aber die Maschine zus\u00e4tzlich mit der Suche nach dem richtigen Datentyp. Dies verlangsamt den Ausf\u00fchrungsprozess.<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>x = 10\r\ns = \"Hello\"<\/code><\/pre>\n<\/div>\n<p>Im Allgemeinen sind \u201ch\u00f6here\u201d Programmiersprachen wie Python f\u00fcr Entwickler deutlich leichter verst\u00e4ndlich. Bei der Ausf\u00fchrung des Codes muss dieser jedoch in maschinennahe Anweisungen \u00fcbersetzt werden. Diese \u00dcbersetzung ist zeitaufwendiger und wird zugunsten der einfacheren Handhabung in Kauf genommen.<\/p>\n<p>Wenn Zeit ein Faktor ist, sollten Sie Low-Level-Befehle verwenden. Anstatt also Code in Python zu schreiben, der die Benutzeroberfl\u00e4che bildet, k\u00f6nnen Sie ihn mit CPython schreiben, das im Hintergrund Python nutzt und in C implementiert ist. Allerdings werden Sie sich dabei f\u00fchlen, als w\u00fcrden Sie in C programmieren, nicht in Python.<\/p>\n<p>CPython ist deutlich komplexer. In CPython ist alles in C implementiert. Die Komplexit\u00e4t von C l\u00e4sst sich beim Programmieren nicht umgehen. Deshalb verwenden viele Entwickler stattdessen Cython. Doch worin genau unterscheidet sich Cython von CPython?<\/p>\n<h2 id=\"cython-%da%86%da%af%d9%88%d9%86%d9%87-%d9%85%d8%aa%d9%81%d8%a7%d9%88%d8%aa-%d8%a7%d8%b3%d8%aa\">Worin unterscheidet sich Cython?<\/h2>\n<p>Wie oben beschrieben, vereint Cython die Vorteile von Geschwindigkeit und Benutzerfreundlichkeit. Sie k\u00f6nnen weiterhin regul\u00e4ren Python-Code schreiben, aber um die Ausf\u00fchrungszeit zu beschleunigen, erm\u00f6glicht Cython das Ersetzen von Teilen des Python-Codes durch C-Code. So kombinieren Sie letztendlich beide Sprachen in einer einzigen Datei. Beachten Sie, dass im Prinzip alles, was in Python m\u00f6glich ist, auch in Cython g\u00fcltig ist, jedoch mit einigen Einschr\u00e4nkungen.<\/p>\n<p>Eine regul\u00e4re Python-Datei hat die Endung .py, eine Cython-Datei hingegen die Endung .pyx. Derselbe Python-Code kann in .pyx-Dateien geschrieben werden, diese erm\u00f6glichen aber auch die Verwendung von Cython-Code. Beachten Sie, dass das Einf\u00fcgen von Python-Code in eine .pyx-Datei die Ausf\u00fchrung zwar beschleunigen kann, aber nicht so schnell ist wie die Deklaration der Variablentypen. Daher konzentriert sich dieses Tutorial nicht nur auf das Schreiben von Python-Code in einer .pyx-Datei, sondern auch auf Optimierungen, die die Ausf\u00fchrungsgeschwindigkeit erh\u00f6hen. Dies macht die Programmierung zwar etwas komplexer, spart aber viel Zeit. Wenn Sie bereits Erfahrung mit der C-Programmierung haben, wird Ihnen dies leichter fallen.<\/p>\n<h2 id=\"%d8%b3%d8%a7%db%8c%d8%aa%d8%b1%d9%88%d9%86-%da%a9%d8%b1%d8%af%d9%86-%da%a9%d8%af-%d8%b3%d8%a7%d8%af%d9%87-%d9%be%d8%a7%db%8c%d8%aa%d9%88%d9%86\">Citronisierung von einfachem Python-Code<\/h2>\n<p>Um Python-Code in Cython zu konvertieren, m\u00fcssen Sie zuerst eine Datei mit der Erweiterung erstellen. <code inline=\"\">.pyx<\/code> Erstellen statt Erweiterung <code inline=\"\">.py<\/code>. Innerhalb dieser Datei k\u00f6nnen Sie mit dem Schreiben von regul\u00e4rem Python-Code beginnen (beachten Sie, dass es einige Einschr\u00e4nkungen hinsichtlich des von Cython akzeptierten Codes gibt, die in der Cython-Dokumentation erl\u00e4utert werden).<\/p>\n<p>Bevor Sie fortfahren, stellen Sie sicher, dass Cython installiert ist. Dies k\u00f6nnen Sie mit dem folgenden Befehl tun.<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>pip install cython\r\n<\/code><\/pre>\n<\/div>\n<p>Um die .pyd-\/.so-Datei zu generieren, muss zun\u00e4chst die Cython-Datei erstellt werden. Die .pyd-\/.so-Datei repr\u00e4sentiert das Modul, das sp\u00e4ter importiert wird. Die Cython-Datei wird mithilfe einer setup.py-Datei erstellt. Erstellen Sie diese Datei und f\u00fcgen Sie den folgenden Code ein. Wir verwenden die Funktion distutils.core.setup(), um die Funktion Cython.Build.cythonize() aufzurufen, welche die .pyx-Datei cyanogenisiert. Diese Funktion erwartet den Pfad zur zu cyanogenisierenden Datei. Hier wird davon ausgegangen, dass sich die setup.py-Datei im selben Verzeichnis wie die test_cython.pyx-Datei befindet.<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import distutils.core\r\nimport Cython.Build\r\ndistutils.core.setup(\r\next_modules = Cython.Build.cythonize(\"test_cython.pyx\"))<\/code><\/pre>\n<\/div>\n<p>Um die Cython-Datei zu erstellen, geben Sie folgenden Befehl in der Kommandozeile ein. Das aktuelle Verzeichnis der Kommandozeile muss mit dem Verzeichnis der Datei setup.py \u00fcbereinstimmen.<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>python setup.py build_ext --inplace\r\n<\/code><\/pre>\n<\/div>\n<p>Nach Abschluss dieses Befehls werden neben der .pyx-Datei zwei weitere Dateien erstellt. Die erste Datei hat die Endung .c, die zweite die Endung .pyd (oder \u00e4hnlich, abh\u00e4ngig vom verwendeten Betriebssystem). Um die generierte Datei zu verwenden, importieren Sie einfach das Modul test_cython. Daraufhin wird die Meldung \u201cHello Cython\u201d direkt angezeigt, wie Sie unten sehen k\u00f6nnen.<\/p>\n<p><a href=\"https:\/\/cdn.itpiran.net\/2024\/12\/09185034\/4.png\"><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"195\"  height=\"47\"  class=\"aligncenter wp-image-16501 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 195px) 100vw, 195px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/12\/09185034\/4.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/12\/09185034\/4.png 195w, https:\/\/cdn.itpiran.net\/2024\/12\/09185034\/4-110x27.png 110w\" ><\/a><\/p>\n<p>Wir haben den Python-Code nun erfolgreich mit Cyton kompiliert. Im n\u00e4chsten Abschnitt geht es um die Kompilierung einer .pyx-Datei mit Cyton, die eine Schleife enth\u00e4lt.<\/p>\n<p>Zytisierung einer &quot;for&quot;-Schleife\u201c<\/p>\n<p>Optimieren wir nun unsere vorherige Aufgabe: eine for-Schleife, die eine Million Zahlen durchl\u00e4uft und summiert. Beginnen wir mit der Untersuchung der Effizienz der Schleife selbst. Das Modul `time` dient dazu, die Ausf\u00fchrungszeit zu sch\u00e4tzen.<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import time\r\nt1 = time.time()\r\nfor k in range(1000000):\r\npass\r\nt2 = time.time()\r\nt = t2-t1\r\nprint(\"%.20f\" % t)<\/code><\/pre>\n<\/div>\n<p>In einer .pyx-Datei betr\u00e4gt die durchschnittliche Ausf\u00fchrungszeit f\u00fcr drei Durchl\u00e4ufe 0,0281 Sekunden. Der Code l\u00e4uft auf einem Rechner mit einem Core i7-6500U Prozessor (2,5 GHz) und 16 GB DDR3-RAM.<\/p>\n<p>Vergleichen wir dies mit der Ausf\u00fchrungszeit einer typischen Python-Datei, die durchschnittlich 0,0411 Sekunden betr\u00e4gt. Das bedeutet, dass Cython bei Iterationen nur 1,46-mal schneller ist als Python, selbst ohne die for-Schleife an die Geschwindigkeit von C anpassen zu m\u00fcssen.<\/p>\n<p>Nun f\u00fcgen wir die Addition hinzu. Dazu verwenden wir die Funktion range().<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import time\r\nt1 = time.time()\r\ntotal = 0\r\nfor k in range(1000000):\r\ntotal = total + k\r\nprint \"Total =\", total\r\nt2 = time.time()\r\nt = t2-t1\r\nprint(\"%.100f\" % t)<\/code><\/pre>\n<\/div>\n<p>Beachten Sie, dass beide Skripte denselben Wert zur\u00fcckgeben, n\u00e4mlich 499999500000. In Python dauert die Ausf\u00fchrung im Durchschnitt 0,1183 Sekunden (\u00fcber drei Tests). In Cython ist sie 1,35-mal schneller und ben\u00f6tigt durchschnittlich 0,0875 Sekunden.<\/p>\n<p>Schauen wir uns nun ein anderes Beispiel an, bei dem die Schleife bei 0 beginnt und 1 Milliarde Zahlen durchl\u00e4uft.<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import time\r\nt1 = time.time()\r\ntotal = 0\r\nfor k in range(1000000000):\r\ntotal = total + k\r\nprint \"Total =\", total\r\nt2 = time.time()\r\nt = t2-t1\r\nprint(\"%.20f\" % t)<\/code><\/pre>\n<\/div>\n<p>Das Cython-Skript war nach etwa 85 Sekunden (1,4 Minuten) fertig, das Python-Skript hingegen nach etwa 115 Sekunden (1,9 Minuten). In beiden F\u00e4llen dauert es viel zu lange. Welchen Sinn hat es, Cython zu verwenden, wenn selbst eine so einfache Aufgabe \u00fcber eine Minute dauert? Wohlgemerkt, das ist unser Fehler, nicht der von Cython.<\/p>\n<p>Wie bereits erw\u00e4hnt, ist das Schreiben von Python-Code innerhalb eines Cython-Skripts (.pyx) zwar eine Verbesserung, f\u00fchrt aber nicht zu einer signifikanten Laufzeitverbesserung. Daher m\u00fcssen wir einige \u00c4nderungen am Python-Code innerhalb des Cython-Skripts vornehmen. Zun\u00e4chst m\u00fcssen wir die Datentypen der verwendeten Variablen explizit deklarieren.<\/p>\n<h2 id=\"%d8%aa%d8%ae%d8%b5%db%8c%d8%b5-%d9%86%d9%88%d8%b9-%d8%af%d8%a7%d8%af%d9%87-c-%d8%a8%d9%87-%d9%85%d8%aa%d8%ba%db%8c%d8%b1%d9%87%d8%a7\">Zuweisung von C-Datentypen zu Variablen<\/h2>\n<p>Im vorherigen Code werden f\u00fcnf Variablen verwendet: total, k, t1, t2 und t. Der Datentyp dieser Variablen wird implizit vom Code abgeleitet, was Zeit kostet. Um Zeit bei der Datentypableitung zu sparen, weisen wir ihnen die Datentypen aus der Programmiersprache C zu.<\/p>\n<p>Der Datentyp der Variable `total` ist `unsigned long long int`. Sie ist vom Typ `int`, da die Summe aller Zahlen eine ganze Zahl ist, und vom Typ `unsigned`, da die Summe immer positiv ist. Aber warum `long long`? Weil die Summe aller Zahlen sehr gro\u00df ist, wird `long long` verwendet, um die Variable so gro\u00df wie m\u00f6glich zu machen.<\/p>\n<p>Der Variable k wurde der Datentyp int zugewiesen, den \u00fcbrigen drei Variablen t1, t2 und t wurde der Datentyp float zugewiesen.<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import time\r\ncdef unsigned long long int total\r\ncdef int k\r\ncdef float t1, t2, t\r\nt1 = time.time()\r\nfor k in range(1000000000):\r\ntotal = total + k\r\nprint \"Total =\", total\r\nt2 = time.time()\r\nt = t2-t1\r\nprint(\"%.100f\" % t)<\/code><\/pre>\n<\/div>\n<p>Beachten Sie, dass die in der letzten print-Anweisung definierte Genauigkeit auf 100 gesetzt ist und alle Zahlen Null sind (siehe n\u00e4chstes Bild). Genau das k\u00f6nnen wir von Cython erwarten. W\u00e4hrend Python mehr als 1,9 Minuten ben\u00f6tigt, ist Cython in k\u00fcrzester Zeit fertig. Ich w\u00fcrde nicht einmal behaupten, dass es 1000- oder 100000-mal schneller ist als Python; ich habe verschiedene Genauigkeiten f\u00fcr die Ausgabe der Zeit ausprobiert, und es wird trotzdem keine Zahl angezeigt.<\/p>\n<p><a href=\"https:\/\/cdn.itpiran.net\/2024\/12\/09185717\/5.png\"><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"576\"  height=\"44\"  class=\"aligncenter wp-image-16502 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 576px) 100vw, 576px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/12\/09185717\/5.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/12\/09185717\/5.png 576w, https:\/\/cdn.itpiran.net\/2024\/12\/09185717\/5-300x23.png 300w, https:\/\/cdn.itpiran.net\/2024\/12\/09185717\/5-110x8.png 110w, https:\/\/cdn.itpiran.net\/2024\/12\/09185717\/5-200x15.png 200w, https:\/\/cdn.itpiran.net\/2024\/12\/09185717\/5-380x29.png 380w, https:\/\/cdn.itpiran.net\/2024\/12\/09185717\/5-255x19.png 255w, https:\/\/cdn.itpiran.net\/2024\/12\/09185717\/5-550x42.png 550w\" ><\/a><\/p>\n<p>Beachten Sie, dass Sie auch eine Integer-Variable erstellen k\u00f6nnen, um den an die Funktion `range()` \u00fcbergebenen Wert zu speichern. Dies verbessert die Performance zus\u00e4tzlich. Der neue Code ist unten aufgef\u00fchrt; der Wert wird in der Integer-Variable `maxval` gespeichert.<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-python\" data-lang=\"Python\"><code>import time\r\ncdef unsigned long long int maxval\r\ncdef unsigned long long int total\r\ncdef int k\r\ncdef float t1, t2, t\r\nmaxval=1000000000\r\nt1=time.time()\r\nfor k in range(maxval):\r\ntotal = total + k\r\nprint \"Total =\", total\r\nt2=time.time()\r\nt = t2-t1\r\nprint(\"%.100f\" % t)<\/code><\/pre>\n<\/div>\n<p>Nachdem wir gesehen haben, wie man die Leistung von Python-Skripten mithilfe von Cython steigern kann, wenden wir dies nun auf den Raspberry Pi (RPi) an.<\/p>\n<h2 id=\"%d8%af%d8%b3%d8%aa%d8%b1%d8%b3%d9%be%d8%b0%db%8c%d8%b1%db%8c-raspberry-pi-%d8%a7%d8%b2-%da%a9%d8%a7%d9%85%d9%be%db%8c%d9%88%d8%aa%d8%b1-%d8%b4%d8%ae%d8%b5%db%8c\">Raspberry Pi-Zugriff von einem PC aus<\/h2>\n<p>Wenn Sie Ihren Raspberry Pi zum ersten Mal verwenden, m\u00fcssen Sie sowohl Ihren PC als auch Ihren RPi mit einem Netzwerk verbinden. Verbinden Sie dazu beide Ger\u00e4te mit einem Switch, auf dem DHCP (Dynamic Host Configuration Protocol) aktiviert ist, um IP-Adressen automatisch zuzuweisen. Sobald das Netzwerk erfolgreich eingerichtet ist, k\u00f6nnen Sie \u00fcber die zugewiesene IPv4-Adresse auf Ihren RPi zugreifen. Wie finden Sie heraus, welche IPv4-Adresse Ihr RPi hat? Keine Sorge, Sie k\u00f6nnen einfach ein IP-Scanner-Tool verwenden. In diesem Tutorial verwende ich die kostenlose App \u201eAdvanced IP Scanner\u201c.<\/p>\n<p>Die Benutzeroberfl\u00e4che dieser Anwendung sieht wie folgt aus. Diese Anwendung akzeptiert einen Bereich von IPv4-Adressen zur Suche und gibt Informationen \u00fcber aktive Ger\u00e4te zur\u00fcck.<\/p>\n<p><a href=\"https:\/\/cdn.itpiran.net\/2024\/12\/09185936\/6.png\"><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"576\"  height=\"366\"  class=\"aligncenter wp-image-16503 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 576px) 100vw, 576px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/12\/09185936\/6.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/12\/09185936\/6.png 576w, https:\/\/cdn.itpiran.net\/2024\/12\/09185936\/6-300x191.png 300w, https:\/\/cdn.itpiran.net\/2024\/12\/09185936\/6-110x70.png 110w, https:\/\/cdn.itpiran.net\/2024\/12\/09185936\/6-200x127.png 200w, https:\/\/cdn.itpiran.net\/2024\/12\/09185936\/6-380x241.png 380w, https:\/\/cdn.itpiran.net\/2024\/12\/09185936\/6-255x162.png 255w, https:\/\/cdn.itpiran.net\/2024\/12\/09185936\/6-550x349.png 550w\" ><\/a><\/p>\n<p>Sie m\u00fcssen den IPv4-Adressbereich Ihres lokalen Netzwerks eingeben. Falls Sie diesen Bereich nicht kennen, f\u00fchren Sie unter Windows den Befehl `ipconfig` (oder unter Linux `ifconfig`) aus, um die IPv4-Adresse Ihres Computers zu ermitteln (siehe Abbildung unten). In meinem Fall lautet die IPv4-Adresse des WLAN-Adapters meines Computers 192.168.43.177 und die Subnetzmaske 255.255.255.0. Das bedeutet, dass der IPv4-Adressbereich im Netzwerk von 192.168.43.1 bis 192.168.43.255 reicht. Wie in der Abbildung dargestellt, ist die IPv4-Adresse 192.168.43.1 dem Gateway zugewiesen. Beachten Sie, dass die letzte IPv4-Adresse in diesem Bereich, 192.168.43.255, f\u00fcr Broadcast-Nachrichten reserviert ist. Der Suchbereich beginnt also bei 192.168.43.2 und endet bei 192.168.43.254.<\/p>\n<p><a href=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190052\/7.png\"><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"544\"  height=\"170\"  class=\"aligncenter wp-image-16504 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 544px) 100vw, 544px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190052\/7.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190052\/7.png 544w, https:\/\/cdn.itpiran.net\/2024\/12\/09190052\/7-300x94.png 300w, https:\/\/cdn.itpiran.net\/2024\/12\/09190052\/7-110x34.png 110w, https:\/\/cdn.itpiran.net\/2024\/12\/09190052\/7-200x63.png 200w, https:\/\/cdn.itpiran.net\/2024\/12\/09190052\/7-380x119.png 380w, https:\/\/cdn.itpiran.net\/2024\/12\/09190052\/7-255x80.png 255w\" ><\/a><\/p>\n<p>Dem Scan-Ergebnis in der n\u00e4chsten Abbildung zufolge lautet die dem RPi zugewiesene IPv4-Adresse 192.168.43.63. Diese IPv4-Adresse kann verwendet werden, um eine Secure Shell (SSH)-Sitzung herzustellen.<\/p>\n<p><a href=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190516\/8.png\"><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"576\"  height=\"366\"  class=\"aligncenter wp-image-16505 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 576px) 100vw, 576px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190516\/8.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190516\/8.png 576w, https:\/\/cdn.itpiran.net\/2024\/12\/09190516\/8-300x191.png 300w, https:\/\/cdn.itpiran.net\/2024\/12\/09190516\/8-110x70.png 110w, https:\/\/cdn.itpiran.net\/2024\/12\/09190516\/8-200x127.png 200w, https:\/\/cdn.itpiran.net\/2024\/12\/09190516\/8-380x241.png 380w, https:\/\/cdn.itpiran.net\/2024\/12\/09190516\/8-255x162.png 255w, https:\/\/cdn.itpiran.net\/2024\/12\/09190516\/8-550x349.png 550w\" ><\/a><\/p>\n<p>Um eine SSH-Sitzung herzustellen, verwende ich die kostenlose Software MobaXterm. Die Benutzeroberfl\u00e4che dieses Programms sieht wie folgt aus.<\/p>\n<p><a href=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190623\/9.png\"><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"576\"  height=\"307\"  class=\"aligncenter wp-image-16506 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 576px) 100vw, 576px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190623\/9.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190623\/9.png 576w, https:\/\/cdn.itpiran.net\/2024\/12\/09190623\/9-300x160.png 300w, https:\/\/cdn.itpiran.net\/2024\/12\/09190623\/9-110x59.png 110w, https:\/\/cdn.itpiran.net\/2024\/12\/09190623\/9-200x107.png 200w, https:\/\/cdn.itpiran.net\/2024\/12\/09190623\/9-380x203.png 380w, https:\/\/cdn.itpiran.net\/2024\/12\/09190623\/9-255x136.png 255w, https:\/\/cdn.itpiran.net\/2024\/12\/09190623\/9-550x293.png 550w\" ><\/a><\/p>\n<p>Um eine SSH-Sitzung zu erstellen, klicken Sie einfach auf die Schaltfl\u00e4che \u201eSitzung\u201c in der oberen linken Ecke. Ein neues Fenster wird wie unten dargestellt angezeigt.<\/p>\n<p><a href=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190749\/10.png\"><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"576\"  height=\"387\"  class=\"aligncenter wp-image-16507 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 576px) 100vw, 576px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190749\/10.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190749\/10.png 576w, https:\/\/cdn.itpiran.net\/2024\/12\/09190749\/10-300x202.png 300w, https:\/\/cdn.itpiran.net\/2024\/12\/09190749\/10-110x74.png 110w, https:\/\/cdn.itpiran.net\/2024\/12\/09190749\/10-200x134.png 200w, https:\/\/cdn.itpiran.net\/2024\/12\/09190749\/10-380x255.png 380w, https:\/\/cdn.itpiran.net\/2024\/12\/09190749\/10-255x171.png 255w, https:\/\/cdn.itpiran.net\/2024\/12\/09190749\/10-550x370.png 550w\" ><\/a><\/p>\n<p>Klicken Sie in diesem Fenster auf die Schaltfl\u00e4che \u201eSSH\u201c oben links, um das unten abgebildete Fenster zu \u00f6ffnen. Geben Sie einfach die IPv4-Adresse und den Benutzernamen des Raspberry Pi (standardm\u00e4\u00dfig \u201epi\u201c) ein und klicken Sie anschlie\u00dfend auf \u201eOK\u201c, um die Sitzung zu starten.<\/p>\n<p><a href=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190859\/11.png\"><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"576\"  height=\"387\"  class=\"aligncenter wp-image-16508 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 576px) 100vw, 576px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190859\/11.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190859\/11.png 576w, https:\/\/cdn.itpiran.net\/2024\/12\/09190859\/11-300x202.png 300w, https:\/\/cdn.itpiran.net\/2024\/12\/09190859\/11-110x74.png 110w, https:\/\/cdn.itpiran.net\/2024\/12\/09190859\/11-200x134.png 200w, https:\/\/cdn.itpiran.net\/2024\/12\/09190859\/11-380x255.png 380w, https:\/\/cdn.itpiran.net\/2024\/12\/09190859\/11-255x171.png 255w, https:\/\/cdn.itpiran.net\/2024\/12\/09190859\/11-550x370.png 550w\" ><\/a><\/p>\n<p>Nach dem Klicken auf \u201eOK\u201c \u00f6ffnet sich ein neues Fenster, in dem Sie das Passwort eingeben m\u00fcssen. Das Standardpasswort lautet \u201eraspberrypi\u201c. Nach der Anmeldung erscheint das folgende Fenster. Im linken Bereich k\u00f6nnen Sie bequem durch die Verzeichnisse Ihres Raspberry Pi navigieren. Au\u00dferdem gibt es eine Kommandozeile zur Eingabe von Befehlen.<\/p>\n<p><a href=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190959\/12.png\"><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"576\"  height=\"307\"  class=\"aligncenter wp-image-16509 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 576px) 100vw, 576px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190959\/12.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/12\/09190959\/12.png 576w, https:\/\/cdn.itpiran.net\/2024\/12\/09190959\/12-300x160.png 300w, https:\/\/cdn.itpiran.net\/2024\/12\/09190959\/12-110x59.png 110w, https:\/\/cdn.itpiran.net\/2024\/12\/09190959\/12-200x107.png 200w, https:\/\/cdn.itpiran.net\/2024\/12\/09190959\/12-380x203.png 380w, https:\/\/cdn.itpiran.net\/2024\/12\/09190959\/12-255x136.png 255w, https:\/\/cdn.itpiran.net\/2024\/12\/09190959\/12-550x293.png 550w\" ><\/a><\/p>\n<h2 id=\"%d8%a7%d8%b3%d8%aa%d9%81%d8%a7%d8%af%d9%87-%d8%a7%d8%b2-cython-%d8%a8%d8%a7-raspberry-pi\">Cython mit Raspberry Pi verwenden<\/h2>\n<p>Erstellen Sie eine neue Datei und \u00e4ndern Sie deren Dateiendung in .pyx, um den Code aus dem vorherigen Beispiel einzuf\u00fcgen. In der linken Leiste finden Sie Optionen zum Erstellen neuer Dateien und Verzeichnisse. Das Symbol f\u00fcr eine neue Datei erleichtert dies, wie in der Abbildung unten gezeigt. Ich habe im Stammverzeichnis des Raspberry Pi eine Datei namens test_cython.pyx erstellt.<\/p>\n<p><a href=\"https:\/\/cdn.itpiran.net\/2024\/12\/09191116\/14.png\"><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"223\"  height=\"328\"  class=\"aligncenter wp-image-16510 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 223px) 100vw, 223px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/12\/09191116\/14.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/12\/09191116\/14.png 223w, https:\/\/cdn.itpiran.net\/2024\/12\/09191116\/14-204x300.png 204w, https:\/\/cdn.itpiran.net\/2024\/12\/09191116\/14-110x162.png 110w, https:\/\/cdn.itpiran.net\/2024\/12\/09191116\/14-200x294.png 200w\" ><\/a><\/p>\n<p>Doppelklicken Sie auf die Datei, um sie zu \u00f6ffnen, f\u00fcgen Sie den Code ein und speichern Sie sie. Als N\u00e4chstes erstellen wir die Datei setup.py, die genau wie zuvor besprochen aufgebaut sein wird. Danach f\u00fchren wir den folgenden Befehl aus, um das Cython-Skript zu kompilieren.<\/p>\n<div class=\"hcb_wrap\" data-no-translation=\"\" data-no-auto-translation=\"\">\n<pre class=\"prism line-numbers lang-bash\" data-lang=\"Bash\"><code>python3 setup.py build_ext --inplace\r\n<\/code><\/pre>\n<\/div>\n<p>Nach erfolgreicher Ausf\u00fchrung dieses Befehls finden Sie die Ausgabedateien im linken Bereich, wie in der folgenden Abbildung dargestellt. Beachten Sie, dass die Dateiendung des zu importierenden Moduls nun .so lautet, da wir nicht mehr Windows verwenden.<\/p>\n<p><a href=\"https:\/\/cdn.itpiran.net\/2024\/12\/09191406\/15.png\"><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"521\"  height=\"386\"  class=\"aligncenter wp-image-16511 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 521px) 100vw, 521px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/12\/09191406\/15.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/12\/09191406\/15.png 521w, https:\/\/cdn.itpiran.net\/2024\/12\/09191406\/15-300x222.png 300w, https:\/\/cdn.itpiran.net\/2024\/12\/09191406\/15-110x81.png 110w, https:\/\/cdn.itpiran.net\/2024\/12\/09191406\/15-200x148.png 200w, https:\/\/cdn.itpiran.net\/2024\/12\/09191406\/15-380x282.png 380w, https:\/\/cdn.itpiran.net\/2024\/12\/09191406\/15-255x189.png 255w\" ><\/a><\/p>\n<p>Aktivieren wir nun Python und importieren das Modul, wie unten gezeigt. Die Ergebnisse sind dieselben wie auf einem PC; der Zeitaufwand ist praktisch null.<\/p>\n<p><a href=\"https:\/\/cdn.itpiran.net\/2024\/12\/09191524\/16.png\"><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"576\"  height=\"94\"  class=\"aligncenter wp-image-16512 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 576px) 100vw, 576px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/12\/09191524\/16.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/12\/09191524\/16.png 576w, https:\/\/cdn.itpiran.net\/2024\/12\/09191524\/16-300x49.png 300w, https:\/\/cdn.itpiran.net\/2024\/12\/09191524\/16-110x18.png 110w, https:\/\/cdn.itpiran.net\/2024\/12\/09191524\/16-200x33.png 200w, https:\/\/cdn.itpiran.net\/2024\/12\/09191524\/16-380x62.png 380w, https:\/\/cdn.itpiran.net\/2024\/12\/09191524\/16-255x42.png 255w, https:\/\/cdn.itpiran.net\/2024\/12\/09191524\/16-550x90.png 550w\" ><\/a><\/p>\n<h2 id=\"%d9%86%d8%aa%db%8c%d8%ac%d9%87\">Ergebnis<\/h2>\n<p>Dieses Tutorial befasste sich mit der Verwendung von Cython zur Reduzierung der Ausf\u00fchrungszeit von Python-Skripten. Wir zeigen ein Beispiel f\u00fcr die Verwendung einer Schleife. <code inline=\"\">f\u00fcr<\/code> Wir haben die Addition aller Elemente einer Python-Liste mit einer Milliarde Zahlen untersucht und die Ausf\u00fchrungszeit mit und ohne Deklaration der Variablen verglichen. W\u00e4hrend dieser Vorgang in reinem Python fast zwei Minuten dauert, l\u00e4uft er mit Cython und der Deklaration statischer Variablen praktisch in k\u00fcrzester Zeit ab.<\/p>","protected":false},"excerpt":{"rendered":"Einleitung: Python mag zwar eine der beliebtesten Programmiersprachen heutzutage sein, aber sie ist definitiv nicht die effizienteste. Insbesondere in der Welt von\u2026","protected":false},"author":1,"featured_media":16513,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_yoast_wpseo_focuskw":"\u0628\u0647\u06cc\u0646\u0647\u200c\u0633\u0627\u0632\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u0628\u0627 \u0633\u0627\u06cc\u062b\u0648\u0646","_yoast_wpseo_title":"","_yoast_wpseo_metadesc":"","_yoast_wpseo_canonical":"","_yoast_wpseo_opengraph-description":"","_yoast_wpseo_opengraph-image":"","_yoast_wpseo_twitter-description":"","_yoast_wpseo_twitter-image":"","_yoast_wpseo_focuskeywords":"[]","_yoast_wpseo_primary_category":"193","footnotes":""},"categories":[193,363],"tags":[376],"class_list":{"0":"post-16496","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-tutorials","8":"category-programming","9":"tag-python"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u0628\u0647\u0628\u0648\u062f \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a\u200c\u0647\u0627\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u0628\u0627 \u0633\u0627\u06cc\u062b\u0648\u0646 - \u0628\u0644\u0627\u06af ITPiran<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.itpiran.net\/blog\/de\/tutorials\/boosting-python-scripts-cython\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u0628\u0647\u0628\u0648\u062f \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a\u200c\u0647\u0627\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u0628\u0627 \u0633\u0627\u06cc\u062b\u0648\u0646 - \u0628\u0644\u0627\u06af ITPiran\" \/>\n<meta property=\"og:description\" content=\"\u0645\u0642\u062f\u0645\u0647 \u067e\u0627\u06cc\u062a\u0648\u0646 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u06cc\u06a9\u06cc \u0627\u0632 \u0645\u062d\u0628\u0648\u0628\u200c\u062a\u0631\u06cc\u0646 \u0632\u0628\u0627\u0646\u200c\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633\u06cc \u0627\u0645\u0631\u0648\u0632\u06cc \u0628\u0627\u0634\u062f\u060c \u0627\u0645\u0627 \u0642\u0637\u0639\u0627\u064b \u06a9\u0627\u0631\u0622\u0645\u062f\u062a\u0631\u06cc\u0646 \u0646\u06cc\u0633\u062a. \u0628\u0647\u200c\u0648\u06cc\u0698\u0647 \u062f\u0631 \u062f\u0646\u06cc\u0627\u06cc&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.itpiran.net\/blog\/de\/tutorials\/boosting-python-scripts-cython\/\" \/>\n<meta property=\"og:site_name\" content=\"\u0628\u0644\u0627\u06af ITPiran\" \/>\n<meta property=\"article:published_time\" content=\"2024-12-09T16:21:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.itpiran.net\/2024\/12\/09195033\/python-to-sython.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1793\" \/>\n\t<meta property=\"og:image:height\" content=\"1110\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"20\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/boosting-python-scripts-cython\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/boosting-python-scripts-cython\\\/\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#\\\/schema\\\/person\\\/04ed27b919baca468a2273f8e4318f81\"},\"headline\":\"\u0628\u0647\u0628\u0648\u062f \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a\u200c\u0647\u0627\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u0628\u0627 \u0633\u0627\u06cc\u062b\u0648\u0646\",\"datePublished\":\"2024-12-09T16:21:44+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/boosting-python-scripts-cython\\\/\"},\"wordCount\":207,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/boosting-python-scripts-cython\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/cdn.itpiran.net\\\/2024\\\/12\\\/09195033\\\/python-to-sython.jpg\",\"keywords\":[\"Python\"],\"articleSection\":[\"\u0622\u0645\u0648\u0632\u0634\u06cc\",\"\u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0648\u06cc\u0633\u06cc\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/boosting-python-scripts-cython\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/boosting-python-scripts-cython\\\/\",\"url\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/boosting-python-scripts-cython\\\/\",\"name\":\"\u0628\u0647\u0628\u0648\u062f \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a\u200c\u0647\u0627\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u0628\u0627 \u0633\u0627\u06cc\u062b\u0648\u0646 - \u0628\u0644\u0627\u06af ITPiran\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/boosting-python-scripts-cython\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/boosting-python-scripts-cython\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/cdn.itpiran.net\\\/2024\\\/12\\\/09195033\\\/python-to-sython.jpg\",\"datePublished\":\"2024-12-09T16:21:44+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/boosting-python-scripts-cython\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/boosting-python-scripts-cython\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/boosting-python-scripts-cython\\\/#primaryimage\",\"url\":\"https:\\\/\\\/cdn.itpiran.net\\\/2024\\\/12\\\/09195033\\\/python-to-sython.jpg\",\"contentUrl\":\"https:\\\/\\\/cdn.itpiran.net\\\/2024\\\/12\\\/09195033\\\/python-to-sython.jpg\",\"width\":1793,\"height\":1110},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/boosting-python-scripts-cython\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u0622\u0645\u0648\u0632\u0634\u06cc\",\"item\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/category\\\/tutorials\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"\u0628\u0647\u0628\u0648\u062f \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a\u200c\u0647\u0627\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u0628\u0627 \u0633\u0627\u06cc\u062b\u0648\u0646\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/\",\"name\":\"\u0628\u0644\u0627\u06af ITPiran\",\"description\":\"\u0627\u062e\u0628\u0627\u0631 \u0648 \u0645\u0642\u0627\u0644\u0627\u062a \u062a\u062c\u0627\u0631\u062a \u067e\u0627\u06cc\u062f\u0627\u0631 \u0627\u06cc\u0631\u0627\u0646\u06cc\u0627\u0646\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#organization\",\"name\":\"\u0628\u0644\u0627\u06af \u062a\u062c\u0627\u0631\u062a \u067e\u0627\u06cc\u062f\u0627\u0631 \u0627\u06cc\u0631\u0627\u0646\u06cc\u0627\u0646\",\"alternateName\":\"ITPIran Blog\",\"url\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/cdn.itpiran.net\\\/2023\\\/12\\\/27150508\\\/cropped-ITPIRAN-BLOG-LOGO-2.png\",\"contentUrl\":\"https:\\\/\\\/cdn.itpiran.net\\\/2023\\\/12\\\/27150508\\\/cropped-ITPIRAN-BLOG-LOGO-2.png\",\"width\":512,\"height\":512,\"caption\":\"\u0628\u0644\u0627\u06af \u062a\u062c\u0627\u0631\u062a \u067e\u0627\u06cc\u062f\u0627\u0631 \u0627\u06cc\u0631\u0627\u0646\u06cc\u0627\u0646\"},\"image\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#\\\/schema\\\/person\\\/04ed27b919baca468a2273f8e4318f81\",\"name\":\"admin\",\"url\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/de\\\/author\\\/admin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Python-Skripte mit Cython verbessern \u2013 ITPiran-Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.itpiran.net\/blog\/de\/tutorials\/boosting-python-scripts-cython\/","og_locale":"de_DE","og_type":"article","og_title":"\u0628\u0647\u0628\u0648\u062f \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a\u200c\u0647\u0627\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u0628\u0627 \u0633\u0627\u06cc\u062b\u0648\u0646 - \u0628\u0644\u0627\u06af ITPiran","og_description":"\u0645\u0642\u062f\u0645\u0647 \u067e\u0627\u06cc\u062a\u0648\u0646 \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u06cc\u06a9\u06cc \u0627\u0632 \u0645\u062d\u0628\u0648\u0628\u200c\u062a\u0631\u06cc\u0646 \u0632\u0628\u0627\u0646\u200c\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633\u06cc \u0627\u0645\u0631\u0648\u0632\u06cc \u0628\u0627\u0634\u062f\u060c \u0627\u0645\u0627 \u0642\u0637\u0639\u0627\u064b \u06a9\u0627\u0631\u0622\u0645\u062f\u062a\u0631\u06cc\u0646 \u0646\u06cc\u0633\u062a. \u0628\u0647\u200c\u0648\u06cc\u0698\u0647 \u062f\u0631 \u062f\u0646\u06cc\u0627\u06cc&hellip;","og_url":"https:\/\/www.itpiran.net\/blog\/de\/tutorials\/boosting-python-scripts-cython\/","og_site_name":"\u0628\u0644\u0627\u06af ITPiran","article_published_time":"2024-12-09T16:21:44+00:00","og_image":[{"width":1793,"height":1110,"url":"https:\/\/cdn.itpiran.net\/2024\/12\/09195033\/python-to-sython.jpg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"admin","Gesch\u00e4tzte Lesezeit":"20\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/boosting-python-scripts-cython\/#article","isPartOf":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/boosting-python-scripts-cython\/"},"author":{"name":"admin","@id":"https:\/\/www.itpiran.net\/blog\/#\/schema\/person\/04ed27b919baca468a2273f8e4318f81"},"headline":"\u0628\u0647\u0628\u0648\u062f \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a\u200c\u0647\u0627\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u0628\u0627 \u0633\u0627\u06cc\u062b\u0648\u0646","datePublished":"2024-12-09T16:21:44+00:00","mainEntityOfPage":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/boosting-python-scripts-cython\/"},"wordCount":207,"commentCount":0,"publisher":{"@id":"https:\/\/www.itpiran.net\/blog\/#organization"},"image":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/boosting-python-scripts-cython\/#primaryimage"},"thumbnailUrl":"https:\/\/cdn.itpiran.net\/2024\/12\/09195033\/python-to-sython.jpg","keywords":["Python"],"articleSection":["\u0622\u0645\u0648\u0632\u0634\u06cc","\u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0648\u06cc\u0633\u06cc"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.itpiran.net\/blog\/tutorials\/boosting-python-scripts-cython\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/boosting-python-scripts-cython\/","url":"https:\/\/www.itpiran.net\/blog\/tutorials\/boosting-python-scripts-cython\/","name":"Python-Skripte mit Cython verbessern \u2013 ITPiran-Blog","isPartOf":{"@id":"https:\/\/www.itpiran.net\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/boosting-python-scripts-cython\/#primaryimage"},"image":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/boosting-python-scripts-cython\/#primaryimage"},"thumbnailUrl":"https:\/\/cdn.itpiran.net\/2024\/12\/09195033\/python-to-sython.jpg","datePublished":"2024-12-09T16:21:44+00:00","breadcrumb":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/boosting-python-scripts-cython\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.itpiran.net\/blog\/tutorials\/boosting-python-scripts-cython\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/boosting-python-scripts-cython\/#primaryimage","url":"https:\/\/cdn.itpiran.net\/2024\/12\/09195033\/python-to-sython.jpg","contentUrl":"https:\/\/cdn.itpiran.net\/2024\/12\/09195033\/python-to-sython.jpg","width":1793,"height":1110},{"@type":"BreadcrumbList","@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/boosting-python-scripts-cython\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.itpiran.net\/blog\/"},{"@type":"ListItem","position":2,"name":"\u0622\u0645\u0648\u0632\u0634\u06cc","item":"https:\/\/www.itpiran.net\/blog\/category\/tutorials\/"},{"@type":"ListItem","position":3,"name":"\u0628\u0647\u0628\u0648\u062f \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a\u200c\u0647\u0627\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u0628\u0627 \u0633\u0627\u06cc\u062b\u0648\u0646"}]},{"@type":"WebSite","@id":"https:\/\/www.itpiran.net\/blog\/#website","url":"https:\/\/www.itpiran.net\/blog\/","name":"ITPiran Blog","description":"Iranische Nachrichten und Artikel zum Thema nachhaltiger Handel","publisher":{"@id":"https:\/\/www.itpiran.net\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.itpiran.net\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.itpiran.net\/blog\/#organization","name":"Nachhaltiger iranischer Unternehmensblog","alternateName":"ITPIran Blog","url":"https:\/\/www.itpiran.net\/blog\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.itpiran.net\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/cdn.itpiran.net\/2023\/12\/27150508\/cropped-ITPIRAN-BLOG-LOGO-2.png","contentUrl":"https:\/\/cdn.itpiran.net\/2023\/12\/27150508\/cropped-ITPIRAN-BLOG-LOGO-2.png","width":512,"height":512,"caption":"\u0628\u0644\u0627\u06af \u062a\u062c\u0627\u0631\u062a \u067e\u0627\u06cc\u062f\u0627\u0631 \u0627\u06cc\u0631\u0627\u0646\u06cc\u0627\u0646"},"image":{"@id":"https:\/\/www.itpiran.net\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.itpiran.net\/blog\/#\/schema\/person\/04ed27b919baca468a2273f8e4318f81","name":"Administrator","url":"https:\/\/www.itpiran.net\/blog\/de\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/posts\/16496","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/comments?post=16496"}],"version-history":[{"count":1,"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/posts\/16496\/revisions"}],"predecessor-version":[{"id":16514,"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/posts\/16496\/revisions\/16514"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/media\/16513"}],"wp:attachment":[{"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/media?parent=16496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/categories?post=16496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/tags?post=16496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}