{"id":16211,"date":"2024-10-10T20:09:25","date_gmt":"2024-10-10T16:39:25","guid":{"rendered":"https:\/\/www.itpiran.net\/blog\/?p=16211"},"modified":"2024-10-10T20:09:25","modified_gmt":"2024-10-10T16:39:25","slug":"getting-started-with-pypy","status":"publish","type":"post","link":"https:\/\/www.itpiran.net\/blog\/de\/tutorials\/getting-started-with-pypy\/","title":{"rendered":"Erste Schritte mit PyPy"},"content":{"rendered":"<h2 id=\"%d9%85%d9%82%d8%af%d9%85%d9%87\">Einf\u00fchrung<\/h2>\n<p>Die Programmiersprache Python ist eine Schnittstelle, die auf vielf\u00e4ltige Weise implementiert werden kann. Beispiele hierf\u00fcr sind CPython, das auf der Programmiersprache C basiert, Jython, das mit Java implementiert ist, usw.<\/p>\n<p>Obwohl CPython die beliebteste Python-Implementierung ist, z\u00e4hlt sie nicht zu den schnellsten. PyPy ist eine alternative Python-Implementierung, die sowohl kompatibel als auch schnell ist. PyPy nutzt die JIT-Kompilierung, wodurch die Ausf\u00fchrungszeit langlaufender Operationen drastisch reduziert wird.<\/p>\n<p>In diesem Tutorial stellen wir PyPy f\u00fcr Anf\u00e4nger vor und heben die Unterschiede zu CPython hervor. Wir besprechen au\u00dferdem die Vorteile und Grenzen von PyPy. Anschlie\u00dfend zeigen wir, wie man PyPy herunterl\u00e4dt und damit ein einfaches Python-Skript ausf\u00fchrt.<\/p>\n<p>Im Einzelnen umfasst diese Schulung Folgendes:<\/p>\n<ul>\n<li>Ein kurzer \u00dcberblick \u00fcber CPython<\/li>\n<li>Einf\u00fchrung in PyPy und seine Funktionen<\/li>\n<li>PyPy-Beschr\u00e4nkungen<\/li>\n<li>PyPy unter Ubuntu ausf\u00fchren<\/li>\n<li>PyPy vs. CPython-Laufzeit<\/li>\n<\/ul>\n<h2 id=\"%d9%85%d8%b1%d9%88%d8%b1%db%8c-%d8%b3%d8%b1%db%8c%d8%b9-%d8%a8%d8%b1-cpython\">Ein kurzer \u00dcberblick \u00fcber CPython<\/h2>\n<p>Bevor wir PyPy besprechen, ist es wichtig zu verstehen, wie CPython funktioniert. Unten sehen Sie eine Abbildung der Ausf\u00fchrungspipeline eines mit CPython implementierten Python-Skripts.<\/p>\n<p><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"1405\"  height=\"1595\"  class=\"aligncenter wp-image-16214 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 1405px) 100vw, 1405px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/10\/10195645\/1.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/10\/10195645\/1.png 1405w, https:\/\/cdn.itpiran.net\/2024\/10\/10195645\/1-264x300.png 264w, https:\/\/cdn.itpiran.net\/2024\/10\/10195645\/1-902x1024.png 902w, https:\/\/cdn.itpiran.net\/2024\/10\/10195645\/1-768x872.png 768w, https:\/\/cdn.itpiran.net\/2024\/10\/10195645\/1-1353x1536.png 1353w, https:\/\/cdn.itpiran.net\/2024\/10\/10195645\/1-110x125.png 110w, https:\/\/cdn.itpiran.net\/2024\/10\/10195645\/1-200x227.png 200w, https:\/\/cdn.itpiran.net\/2024\/10\/10195645\/1-380x431.png 380w, https:\/\/cdn.itpiran.net\/2024\/10\/10195645\/1-255x289.png 255w, https:\/\/cdn.itpiran.net\/2024\/10\/10195645\/1-300x341.png 300w, https:\/\/cdn.itpiran.net\/2024\/10\/10195645\/1-550x624.png 550w, https:\/\/cdn.itpiran.net\/2024\/10\/10195645\/1-800x908.png 800w, https:\/\/cdn.itpiran.net\/2024\/10\/10195645\/1-1160x1317.png 1160w\" ><\/p>\n<p>Ausgehend von einem Python-Skript (Datei mit der Endung .py) wird der Quellcode zun\u00e4chst mit dem CPython-Compiler in Bytecode kompiliert. Der Bytecode wird generiert und in einer Datei mit der Endung .pyc gespeichert. Anschlie\u00dfend wird der Bytecode in einer virtuellen Umgebung mithilfe des CPython-Interpreters ausgef\u00fchrt.<\/p>\n<p>Die Verwendung eines Compilers zur Umwandlung von Quellcode in Bytecode bietet Vorteile. Ohne Compiler arbeitet der Interpreter direkt mit dem Quellcode und \u00fcbersetzt ihn Zeile f\u00fcr Zeile in Maschinencode. Der Nachteil dabei ist, dass f\u00fcr jede Zeile des Quellcodes Prozesse erforderlich sind, die f\u00fcr jede Zeile wiederholt werden. Beispielsweise wird die Syntaxanalyse auf jede Zeile unabh\u00e4ngig von den anderen angewendet, wodurch der Interpreter viel Zeit mit der \u00dcbersetzung verbringt. Der Compiler l\u00f6st dieses Problem, da er den gesamten Code auf einmal verarbeiten kann und die Syntaxanalyse daher nur einmal statt f\u00fcr jede Zeile durchgef\u00fchrt wird. Der vom Compiler erzeugte Bytecode ist somit leicht interpretierbar. Es ist zu beachten, dass die Kompilierung des gesamten Quellcodes in manchen F\u00e4llen nicht sinnvoll sein kann. Ein anschauliches Beispiel hierf\u00fcr wird bei der Besprechung von PyPy gezeigt.<\/p>\n<p>Sobald der Bytecode generiert ist, wird er vom Interpreter in der virtuellen Maschine ausgef\u00fchrt. Die virtuelle Umgebung ist vorteilhaft, da sie den CPython-Bytecode von der Maschine entkoppelt und Python somit plattform\u00fcbergreifend nutzbar macht.<\/p>\n<p>Leider reicht es nicht aus, Bytecode mit einem Compiler zu generieren, um die CPython-Ausf\u00fchrung zu beschleunigen. Der Interpreter \u00fcbersetzt den Code bei jeder Ausf\u00fchrung in Maschinencode. Dauert die Ausf\u00fchrung einer Zeile beispielsweise LX Sekunden, so dauert die zehnfache Ausf\u00fchrung X*10 Sekunden. Bei langlaufenden Operationen ist dies sehr zeitaufwendig.<\/p>\n<p>Ausgehend von den CPython-Bugs werfen wir nun einen Blick auf PyPy.<\/p>\n<h2 id=\"%d9%85%d9%82%d8%af%d9%85%d9%87-%d8%a7%db%8c-%d8%a8%d8%b1-pypy-%d9%88-%d9%88%db%8c%da%98%da%af%db%8c-%d9%87%d8%a7%db%8c-%d8%a2%d9%86\">Einf\u00fchrung in PyPy und seine Funktionen<\/h2>\n<p>PyPy ist eine Python-Implementierung \u00e4hnlich wie CPython, die sowohl kompatibel als auch schnell ist. \u201cKompatibel\u201d bedeutet, dass PyPy mit CPython kompatibel ist, d. h. Sie k\u00f6nnen fast alle CPython-Befehle in PyPy verwenden. Wie bereits erw\u00e4hnt, gibt es einige Unterschiede in der Kompatibilit\u00e4t. PyPys gr\u00f6\u00dfter Vorteil ist seine Geschwindigkeit. PyPy ist deutlich schneller als CPython. Wir werden sp\u00e4ter einige Tests sehen, in denen PyPy etwa siebenmal schneller ist. In manchen F\u00e4llen kann es sogar um ein Vielfaches schneller sein als CPython. Wie erreicht PyPy diese Geschwindigkeit?<\/p>\n<h5 id=\"%d8%b3%d8%b1%d8%b9%d8%aa\">Geschwindigkeit<\/h5>\n<p>PyPy verwendet einen Just-in-Time-Compiler (JIT), der Python-Skripte deutlich beschleunigen kann. CPython hingegen nutzt Ahead-of-Time-Kompilierung (AOT), d. h. der gesamte Code wird vor der Ausf\u00fchrung in Bytecode \u00fcbersetzt. Der JIT-Compiler \u00fcbersetzt den Code erst zur Laufzeit, also nur dann, wenn es n\u00f6tig ist.<\/p>\n<p>Der Quellcode kann Codebl\u00f6cke enthalten, die gar nicht ausgef\u00fchrt, aber dennoch mit dem AOT-Compiler \u00fcbersetzt werden. Dies f\u00fchrt zu l\u00e4ngeren Verarbeitungszeiten. Bei gro\u00dfem Quellcode mit Tausenden von Zeilen macht die Verwendung von JIT einen gro\u00dfen Unterschied. Mit AOT wird der gesamte Quellcode \u00fcbersetzt, was viel Zeit in Anspruch nimmt. Mit JIT werden nur die ben\u00f6tigten Teile des Codes ausgef\u00fchrt, wodurch die Verarbeitung deutlich beschleunigt wird.<\/p>\n<p>Nachdem PyPy einen Codeabschnitt \u00fcbersetzt hat, wird dieser zwischengespeichert. Das bedeutet, dass der Code nur einmal \u00fcbersetzt wird und die \u00dcbersetzung sp\u00e4ter wiederverwendet wird. Der CPython-Interpreter hingegen wiederholt die \u00dcbersetzung bei jeder Codeausf\u00fchrung, was ein weiterer Grund f\u00fcr seine Langsamkeit ist.<\/p>\n<h5 id=\"%d8%a8%db%8c-%d8%b2%d8%ad%d9%85%d8%aa\">M\u00fchelos<\/h5>\n<p>PyPy ist nicht die einzige M\u00f6glichkeit, die Performance von Python-Skripten zu steigern, aber die einfachste. Beispielsweise kann Cython verwendet werden, um die Zuweisung von C-Datentypen zu Variablen zu beschleunigen. Das Problem dabei ist, dass Cython eine manuelle \u00dcberpr\u00fcfung und Optimierung des Quellcodes erfordert. Dies ist m\u00fchsam und wird mit zunehmender Codegr\u00f6\u00dfe immer komplexer. Mit PyPy hingegen wird regul\u00e4rer Python-Code ohne jeglichen Aufwand deutlich schneller ausgef\u00fchrt.<\/p>\n<h5 id=\"%d8%a8%d8%af%d9%88%d9%86-%d9%be%d8%b4%d8%aa%d9%87\">Kein Stapel<\/h5>\n<p>Standard-Python verwendet den C-Stack. Dieser Stack speichert die Abfolge der Funktionen, die voneinander aufgerufen werden (R\u00fcckgabewerte). Da die Gr\u00f6\u00dfe des Stacks begrenzt ist, ist auch die Anzahl der Funktionsaufrufe begrenzt.<\/p>\n<p>PyPy verwendet Stackless Python, eine Python-Implementierung, die ohne den C-Stack auskommt. Stattdessen werden Funktionsaufrufe zusammen mit Objekten auf dem Stack gespeichert. Da der Stack gr\u00f6\u00dfer als der Heap ist, k\u00f6nnen mehr Funktionsaufrufe durchgef\u00fchrt werden.<\/p>\n<p>Stackless Python unterst\u00fctzt auch Mikrothreads, die effizienter als regul\u00e4re Python-Threads sind. In einem Stackless-Python-Thread k\u00f6nnen Tausende von Aufgaben, sogenannte \u00abTasklets\u00bb, ausgef\u00fchrt werden, die alle in einem einzigen Thread laufen.<\/p>\n<p>Mithilfe von Tasklets k\u00f6nnen Aufgaben parallel ausgef\u00fchrt werden. Parallelit\u00e4t bedeutet, dass zwei Aufgaben gleichzeitig laufen und dieselben Ressourcen nutzen. Eine Aufgabe l\u00e4uft eine Zeit lang und wird dann unterbrochen, um Platz f\u00fcr die zweite Aufgabe zu schaffen. Dies unterscheidet sich von Parallelit\u00e4t, bei der zwei separate, aber gleichzeitig ausgef\u00fchrte Aufgaben laufen.<\/p>\n<p>Durch die Verwendung von Tasklets wird die Anzahl der erstellten Threads reduziert, wodurch der Verwaltungsaufwand des Betriebssystems f\u00fcr diese Threads sinkt. Folglich ben\u00f6tigt die Beschleunigung der Ausf\u00fchrung durch Umschalten zwischen zwei Threads mehr Zeit als das Umschalten zwischen zwei Tasks.<\/p>\n<p>Die Verwendung von Stackless Python erm\u00f6glichte auch die Nutzung von Continuations. Mit Continuations k\u00f6nnen wir den Zustand einer Aufgabe speichern und sp\u00e4ter wiederherstellen, um die Aufgabe fortzusetzen. Stackless Python unterscheidet sich nicht von Standard-Python, sondern bietet lediglich zus\u00e4tzliche Funktionen. Alles, was in Standard-Python verf\u00fcgbar ist, ist auch in Stackless Python verf\u00fcgbar.<\/p>\n<p>Nachdem wir die Vorteile von PyPy besprochen haben, wollen wir im n\u00e4chsten Abschnitt auf seine Grenzen eingehen.<\/p>\n<h2 id=\"%d9%85%d8%ad%d8%af%d9%88%d8%af%db%8c%d8%aa-%d9%87%d8%a7%db%8c-pypy\">PyPy-Beschr\u00e4nkungen<\/h2>\n<p>W\u00e4hrend CPython auf jeder Maschine und jeder CPU-Architektur eingesetzt werden kann, ist die Unterst\u00fctzung f\u00fcr PyPy vergleichsweise eingeschr\u00e4nkt.<\/p>\n<p>Hier sind die von PyPy unterst\u00fctzten und gepflegten CPU-Architekturen (Quelle):<\/p>\n<ul>\n<li>x86 (IA-32) und x86_64<\/li>\n<li>ARM-Plattformen (ARMv6 oder ARMv7, mit VFPv3)<\/li>\n<li>AArch64<\/li>\n<li>PowerPC 64-Bit, sowohl Little- als auch Big-Endian<\/li>\n<li>System Z (s390x)<\/li>\n<\/ul>\n<p>PyPy funktioniert nicht auf allen Linux-Distributionen. Verwenden Sie daher unbedingt eine der unterst\u00fctzten Distributionen. Die Ausf\u00fchrung der PyPy-Linux-Bin\u00e4rdatei auf einer nicht unterst\u00fctzten Distribution f\u00fchrt zu einem Fehler. PyPy unterst\u00fctzt nur eine Version von Python 2 und Python 3: PyPy 2.7 und PyPy 3.6.<\/p>\n<p>Wenn der in PyPy ausgef\u00fchrte Code reiner Python-Code ist, ist die durch PyPy erzielte Beschleunigung in der Regel signifikant. Enth\u00e4lt der Code jedoch C-Erweiterungen wie NumPy, kann PyPy die Laufzeit sogar verl\u00e4ngern. Das PyPy-Projekt wird aktiv weiterentwickelt und wird daher zuk\u00fcnftig m\u00f6glicherweise eine bessere Unterst\u00fctzung f\u00fcr C-Erweiterungen bieten.<\/p>\n<p>PyPy wird von vielen g\u00e4ngigen Python-Frameworks, wie beispielsweise Kivy, nicht unterst\u00fctzt. Kivy erm\u00f6glicht es CPython, auf allen Plattformen, einschlie\u00dflich Android und iOS, zu laufen. Das bedeutet, dass PyPy nicht auf Mobilger\u00e4ten ausgef\u00fchrt werden kann.<\/p>\n<p>Nachdem wir nun die Vorteile und Grenzen von PyPy kennengelernt haben, erkl\u00e4ren wir im Folgenden, wie man PyPy unter Ubuntu ausf\u00fchrt.<\/p>\n<h2 id=\"%d8%a7%d8%ac%d8%b1%d8%a7%db%8c-pypy-%d8%af%d8%b1-%d8%a7%d9%88%d8%a8%d9%88%d9%86%d8%aa%d9%88\">PyPy unter Ubuntu ausf\u00fchren<\/h2>\n<p>PyPy kann unter Mac, Linux oder Windows ausgef\u00fchrt werden, wir konzentrieren uns hier jedoch auf die Ausf\u00fchrung unter Ubuntu. Wichtig: PyPy-Bin\u00e4rdateien f\u00fcr Linux werden nur von bestimmten Linux-Distributionen unterst\u00fctzt. Eine Liste der verf\u00fcgbaren PyPy-Bin\u00e4rdateien und der unterst\u00fctzten Distributionen finden Sie auf dieser Seite. Beispielsweise wird PyPy (bzw. Python 2.7 oder Python 3.6) nur von drei Ubuntu-Versionen unterst\u00fctzt: 18.04, 16.04 und 14.04. Wenn Sie die aktuellste Ubuntu-Version (19.10) verwenden, k\u00f6nnen Sie PyPy nicht darauf ausf\u00fchren. Der Versuch, PyPy auf einer nicht unterst\u00fctzten Distribution auszuf\u00fchren, f\u00fchrt zu folgendem Fehler:<\/p>\n<p>PyPy-Bin\u00e4rdateien werden als komprimierte Dateien bereitgestellt. Sie m\u00fcssen lediglich die heruntergeladene Datei entpacken. Im entpackten Ordner befindet sich ein Unterordner namens \u201ebin\u201c, in dem die ausf\u00fchrbare PyPy-Datei zu finden ist. Ich verwende Python 3.6, daher hei\u00dft die Datei \u201epypy3\u201c. F\u00fcr Python 2.7 hei\u00dft sie einfach \u201epypy\u201c.<\/p>\n<p>Um Python 3 unter CPython im Terminal auszuf\u00fchren, geben Sie einfach den Befehl `python3` ein. Um PyPy auszuf\u00fchren, geben Sie einfach den Befehl `pypy3` ein.<\/p>\n<p>Wie in der folgenden Abbildung dargestellt, kann die Eingabe des Befehls `pypy3` im Terminal die Meldung \u2018pypy3 nicht gefunden\u2019 ausgeben. Dies liegt daran, dass der Pfad zu PyPy nicht zur Umgebungsvariablen PATH hinzugef\u00fcgt wurde. Der Befehl `.\/pypy3` funktioniert jedoch, vorausgesetzt, der aktuelle Pfad im Terminal befindet sich im PyPy-Bin\u00e4rverzeichnis. Der Punkt `.` steht f\u00fcr das aktuelle Verzeichnis, und der Schr\u00e4gstrich `\/` greift auf Dateien und Ordner im aktuellen Verzeichnis zu. Die Ausf\u00fchrung des Befehls `.\/pypy3` startet Python erfolgreich.<\/p>\n<p><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"734\"  height=\"298\"  class=\"aligncenter wp-image-16215 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 734px) 100vw, 734px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/10\/10200135\/2-1.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/10\/10200135\/2-1.png 734w, https:\/\/cdn.itpiran.net\/2024\/10\/10200135\/2-1-300x122.png 300w, https:\/\/cdn.itpiran.net\/2024\/10\/10200135\/2-1-110x45.png 110w, https:\/\/cdn.itpiran.net\/2024\/10\/10200135\/2-1-200x81.png 200w, https:\/\/cdn.itpiran.net\/2024\/10\/10200135\/2-1-380x154.png 380w, https:\/\/cdn.itpiran.net\/2024\/10\/10200135\/2-1-255x104.png 255w, https:\/\/cdn.itpiran.net\/2024\/10\/10200135\/2-1-550x223.png 550w\" ><\/p>\n<p>Sie k\u00f6nnen nun wie gewohnt mit Python arbeiten und dabei PyPy nutzen. Beispielsweise k\u00f6nnen wir ein einfaches Python-Skript erstellen, das 1000 Zahlen addiert, und es mit PyPy ausf\u00fchren. Der Code lautet wie folgt.<\/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>nums = range(1000)\r\nsum = 0\r\nfor k in nums:\r\nsum = sum + k\r\nprint(\"Sum of 1,000 numbers is : \", sum)<\/code><\/pre>\n<\/div>\n<p>Wenn dieses Skript test.py hei\u00dft, k\u00f6nnen Sie es einfach mit dem folgenden Befehl ausf\u00fchren (vorausgesetzt, die Python-Datei befindet sich im PyPy-Bin-Ordner, also am selben Ort wie der pypy3-Befehl).<\/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>.\/pypy3 test.py\r\n<\/code><\/pre>\n<\/div>\n<p>Die n\u00e4chste Abbildung zeigt das Ergebnis der Ausf\u00fchrung des vorherigen Codes.<\/p>\n<p><img  loading=\"lazy\"  decoding=\"async\"  src=\"data:image\/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAP+KeNJXAAAAAXRSTlMAQObYZgAAAAlwSFlzAAAOxAAADsQBlSsOGwAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=\"  alt=\"\"  width=\"736\"  height=\"131\"  class=\"aligncenter wp-image-16216 size-full pk-lazyload\"  data-pk-sizes=\"auto\"  data-ls-sizes=\"auto, (max-width: 736px) 100vw, 736px\"  data-pk-src=\"https:\/\/cdn.itpiran.net\/2024\/10\/10200552\/3-1.png\"  data-pk-srcset=\"https:\/\/cdn.itpiran.net\/2024\/10\/10200552\/3-1.png 736w, https:\/\/cdn.itpiran.net\/2024\/10\/10200552\/3-1-300x53.png 300w, https:\/\/cdn.itpiran.net\/2024\/10\/10200552\/3-1-110x20.png 110w, https:\/\/cdn.itpiran.net\/2024\/10\/10200552\/3-1-200x36.png 200w, https:\/\/cdn.itpiran.net\/2024\/10\/10200552\/3-1-380x68.png 380w, https:\/\/cdn.itpiran.net\/2024\/10\/10200552\/3-1-255x45.png 255w, https:\/\/cdn.itpiran.net\/2024\/10\/10200552\/3-1-550x98.png 550w\" ><\/p>\n<h2 id=\"%d8%b2%d9%85%d8%a7%d9%86-%d8%a7%d8%ac%d8%b1%d8%a7%db%8c-pypy-%d8%af%d8%b1-%d9%85%d9%82%d8%a7%d8%a8%d9%84-cpython\">PyPy vs. CPython-Laufzeit<\/h2>\n<p>Um die Ausf\u00fchrungszeit von PyPy und CPython f\u00fcr die Summe von 1000 Zahlen zu vergleichen, \u00e4ndert sich der Code zur Zeitmessung wie folgt.<\/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\nnums = range(1000)\r\nsum = 0\r\nfor k in nums:\r\nsum = sum + k\r\nprint(\"Sum of 1,000 numbers is : \", sum)\r\nt2 = time.time()\r\nt = t2 - t1\r\nprint(\"Elapsed time is : \", t, \" seconds\")<\/code><\/pre>\n<\/div>\n<p>F\u00fcr PyPy liegt die Laufzeit bei etwa 0,00045 Sekunden, verglichen mit 0,0002 Sekunden f\u00fcr CPython (ich habe den Code auf meinem Core i7-6500U-Rechner mit 2,5 GHz ausgef\u00fchrt). In diesem Fall ben\u00f6tigt CPython weniger Zeit als PyPy, was zu erwarten ist, da es sich nicht um eine wirklich langwierige Aufgabe handelt. W\u00fcrde der Code jedoch 1 Million statt 1000 Zahlen addieren, w\u00e4re PyPy letztendlich schneller. In diesem Fall br\u00e4uchte PyPy 0,00035 Sekunden und CPython 0,1 Sekunden. Der Vorteil von PyPy ist nun deutlich. Dies verdeutlicht, wie viel langsamer CPython bei langwierigen Aufgaben ist.<\/p>\n<h2 id=\"%d9%86%d8%aa%db%8c%d8%ac%d9%87\">Ergebnis<\/h2>\n<p>Dieses Tutorial stellt PyPy vor, die schnellste Python-Implementierung. Der Hauptvorteil von PyPy liegt in der Just-in-Time-Kompilierung (JIT), die den kompilierten Maschinencode zwischenspeichert, um eine erneute Ausf\u00fchrung zu verhindern. Auch die Grenzen von PyPy werden aufgezeigt; die wichtigste ist, dass es zwar gut f\u00fcr reinen Python-Code funktioniert, aber f\u00fcr C-Erweiterungen nicht effizient ist.<\/p>\n<p>Wir haben auch untersucht, wie PyPy unter Ubuntu l\u00e4uft, und die Ausf\u00fchrungszeiten von CPython und PyPy verglichen. Dabei zeigte sich PyPys Leistungsf\u00e4higkeit bei langlaufenden Aufgaben. Bei kurzlaufenden Aufgaben k\u00f6nnte CPython jedoch weiterhin die Nase vorn haben. Weitere Vergleiche zwischen PyPy, CPython und Cython werden wir in zuk\u00fcnftigen Artikeln anstellen.<\/p>","protected":false},"excerpt":{"rendered":"Einleitung Die Programmiersprache Python ist eine Schnittstelle, die auf verschiedene Weise implementiert werden kann.\u2026","protected":false},"author":1,"featured_media":16212,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_yoast_wpseo_focuskw":"\u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u0628\u0627 PyPy","_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":[435,376],"class_list":{"0":"post-16211","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-tutorials","8":"category-programming","9":"tag-programming","10":"tag-python"},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u0628\u0627 PyPy - \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\/getting-started-with-pypy\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u0628\u0627 PyPy - \u0628\u0644\u0627\u06af ITPiran\" \/>\n<meta property=\"og:description\" content=\"\u0645\u0642\u062f\u0645\u0647 \u0632\u0628\u0627\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0648\u06cc\u0633\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u06cc\u06a9 \u0631\u0627\u0628\u0637 \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u0631\u0648\u0634 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641\u06cc \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0634\u0648\u062f.&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.itpiran.net\/blog\/de\/tutorials\/getting-started-with-pypy\/\" \/>\n<meta property=\"og:site_name\" content=\"\u0628\u0644\u0627\u06af ITPiran\" \/>\n<meta property=\"article:published_time\" content=\"2024-10-10T16:39:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.itpiran.net\/2024\/10\/10195153\/PYPY-wallpaper.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=\"1\u00a0Minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/getting-started-with-pypy\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/getting-started-with-pypy\\\/\"},\"author\":{\"name\":\"admin\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#\\\/schema\\\/person\\\/04ed27b919baca468a2273f8e4318f81\"},\"headline\":\"\u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u0628\u0627 PyPy\",\"datePublished\":\"2024-10-10T16:39:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/getting-started-with-pypy\\\/\"},\"wordCount\":187,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/getting-started-with-pypy\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/cdn.itpiran.net\\\/2024\\\/10\\\/10195153\\\/PYPY-wallpaper.jpg\",\"keywords\":[\"programming\",\"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\\\/getting-started-with-pypy\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/getting-started-with-pypy\\\/\",\"url\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/getting-started-with-pypy\\\/\",\"name\":\"\u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u0628\u0627 PyPy - \u0628\u0644\u0627\u06af ITPiran\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/getting-started-with-pypy\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/getting-started-with-pypy\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/cdn.itpiran.net\\\/2024\\\/10\\\/10195153\\\/PYPY-wallpaper.jpg\",\"datePublished\":\"2024-10-10T16:39:25+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/getting-started-with-pypy\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/getting-started-with-pypy\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/getting-started-with-pypy\\\/#primaryimage\",\"url\":\"https:\\\/\\\/cdn.itpiran.net\\\/2024\\\/10\\\/10195153\\\/PYPY-wallpaper.jpg\",\"contentUrl\":\"https:\\\/\\\/cdn.itpiran.net\\\/2024\\\/10\\\/10195153\\\/PYPY-wallpaper.jpg\",\"width\":1793,\"height\":1110},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/getting-started-with-pypy\\\/#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\":\"\u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u0628\u0627 PyPy\"}]},{\"@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":"Erste Schritte mit PyPy \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\/getting-started-with-pypy\/","og_locale":"de_DE","og_type":"article","og_title":"\u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u0628\u0627 PyPy - \u0628\u0644\u0627\u06af ITPiran","og_description":"\u0645\u0642\u062f\u0645\u0647 \u0632\u0628\u0627\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0648\u06cc\u0633\u06cc \u067e\u0627\u06cc\u062a\u0648\u0646 \u06cc\u06a9 \u0631\u0627\u0628\u0637 \u0627\u0633\u062a \u06a9\u0647 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u0631\u0648\u0634 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641\u06cc \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0634\u0648\u062f.&hellip;","og_url":"https:\/\/www.itpiran.net\/blog\/de\/tutorials\/getting-started-with-pypy\/","og_site_name":"\u0628\u0644\u0627\u06af ITPiran","article_published_time":"2024-10-10T16:39:25+00:00","og_image":[{"width":1793,"height":1110,"url":"https:\/\/cdn.itpiran.net\/2024\/10\/10195153\/PYPY-wallpaper.jpg","type":"image\/jpeg"}],"author":"admin","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"admin","Gesch\u00e4tzte Lesezeit":"1\u00a0Minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/getting-started-with-pypy\/#article","isPartOf":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/getting-started-with-pypy\/"},"author":{"name":"admin","@id":"https:\/\/www.itpiran.net\/blog\/#\/schema\/person\/04ed27b919baca468a2273f8e4318f81"},"headline":"\u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u0628\u0627 PyPy","datePublished":"2024-10-10T16:39:25+00:00","mainEntityOfPage":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/getting-started-with-pypy\/"},"wordCount":187,"commentCount":0,"publisher":{"@id":"https:\/\/www.itpiran.net\/blog\/#organization"},"image":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/getting-started-with-pypy\/#primaryimage"},"thumbnailUrl":"https:\/\/cdn.itpiran.net\/2024\/10\/10195153\/PYPY-wallpaper.jpg","keywords":["programming","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\/getting-started-with-pypy\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/getting-started-with-pypy\/","url":"https:\/\/www.itpiran.net\/blog\/tutorials\/getting-started-with-pypy\/","name":"Erste Schritte mit PyPy \u2013 ITPiran-Blog","isPartOf":{"@id":"https:\/\/www.itpiran.net\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/getting-started-with-pypy\/#primaryimage"},"image":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/getting-started-with-pypy\/#primaryimage"},"thumbnailUrl":"https:\/\/cdn.itpiran.net\/2024\/10\/10195153\/PYPY-wallpaper.jpg","datePublished":"2024-10-10T16:39:25+00:00","breadcrumb":{"@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/getting-started-with-pypy\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.itpiran.net\/blog\/tutorials\/getting-started-with-pypy\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/getting-started-with-pypy\/#primaryimage","url":"https:\/\/cdn.itpiran.net\/2024\/10\/10195153\/PYPY-wallpaper.jpg","contentUrl":"https:\/\/cdn.itpiran.net\/2024\/10\/10195153\/PYPY-wallpaper.jpg","width":1793,"height":1110},{"@type":"BreadcrumbList","@id":"https:\/\/www.itpiran.net\/blog\/tutorials\/getting-started-with-pypy\/#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":"\u0634\u0631\u0648\u0639 \u06a9\u0627\u0631 \u0628\u0627 PyPy"}]},{"@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\/16211","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=16211"}],"version-history":[{"count":2,"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/posts\/16211\/revisions"}],"predecessor-version":[{"id":16217,"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/posts\/16211\/revisions\/16217"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/media\/16212"}],"wp:attachment":[{"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/media?parent=16211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/categories?post=16211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/de\/wp-json\/wp\/v2\/tags?post=16211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}