{"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\/es\/tutorials\/getting-started-with-pypy\/","title":{"rendered":"Introducci\u00f3n a PyPy"},"content":{"rendered":"<h2 id=\"%d9%85%d9%82%d8%af%d9%85%d9%87\">Introducci\u00f3n<\/h2>\n<p>El lenguaje de programaci\u00f3n Python es una interfaz que se puede implementar de muchas maneras diferentes. Algunos ejemplos incluyen CPython, que usa el lenguaje C; Jython, que se implementa con Java; etc.<\/p>\n<p>A pesar de ser el m\u00e1s popular, CPython no es el m\u00e1s r\u00e1pido. PyPy es una implementaci\u00f3n alternativa de Python compatible y r\u00e1pida. PyPy se basa en la compilaci\u00f3n JIT, lo que reduce dr\u00e1sticamente el tiempo de ejecuci\u00f3n de operaciones de larga duraci\u00f3n.<\/p>\n<p>En este tutorial, presentaremos PyPy para principiantes y destacaremos sus diferencias con CPython. Tambi\u00e9n analizaremos sus ventajas y limitaciones. Despu\u00e9s, veremos c\u00f3mo descargar y usar PyPy para ejecutar un script sencillo de Python.<\/p>\n<p>En concreto, esta formaci\u00f3n cubre lo siguiente:<\/p>\n<ul>\n<li>Una descripci\u00f3n general r\u00e1pida de CPython<\/li>\n<li>Introducci\u00f3n a PyPy y sus caracter\u00edsticas<\/li>\n<li>Limitaciones de PyPy<\/li>\n<li>Ejecutando PyPy en Ubuntu<\/li>\n<li>Tiempo de ejecuci\u00f3n de PyPy vs. CPython<\/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\">Una descripci\u00f3n general r\u00e1pida de CPython<\/h2>\n<p>Antes de hablar de PyPy, es importante comprender c\u00f3mo funciona CPython. A continuaci\u00f3n, se muestra una imagen del flujo de ejecuci\u00f3n de un script de Python implementado con CPython.<\/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>Dado un script de Python .py, el c\u00f3digo fuente se compila primero en bytecode mediante el compilador CPython. El bytecode se genera y se almacena en un archivo con la extensi\u00f3n pyc. Posteriormente, se ejecuta en un entorno virtual mediante el int\u00e9rprete de CPython.<\/p>\n<p>Usar un compilador para convertir el c\u00f3digo fuente a c\u00f3digo de bytes tiene sus ventajas. Si no se usa un compilador, el int\u00e9rprete trabaja directamente con el c\u00f3digo fuente y lo traduce l\u00ednea por l\u00ednea a c\u00f3digo m\u00e1quina. La desventaja es que se deben aplicar procesos para traducir cada l\u00ednea de c\u00f3digo fuente a c\u00f3digo m\u00e1quina, y estos procesos se repiten para cada l\u00ednea. Por ejemplo, el an\u00e1lisis sint\u00e1ctico se aplica a cada l\u00ednea independientemente de las dem\u00e1s, por lo que el int\u00e9rprete dedica mucho tiempo a traducir el c\u00f3digo. El compilador soluciona este problema porque puede procesar todo el c\u00f3digo a la vez, por lo que el an\u00e1lisis sint\u00e1ctico se aplica solo una vez en lugar de para cada l\u00ednea de c\u00f3digo. De esta manera, el c\u00f3digo de bytes generado por el compilador se interpreta f\u00e1cilmente. Tenga en cuenta que compilar todo el c\u00f3digo fuente puede no ser \u00fatil en algunos casos, y veremos un claro ejemplo de esto al hablar de PyPy.<\/p>\n<p>Una vez generado el bytecode, el int\u00e9rprete que se ejecuta en la m\u00e1quina virtual lo ejecuta. El entorno virtual es beneficioso porque desacopla el bytecode de CPython de la m\u00e1quina, lo que permite que Python sea multiplataforma.<\/p>\n<p>Desafortunadamente, usar un compilador para generar c\u00f3digo de bytes no es suficiente para acelerar la ejecuci\u00f3n de CPython. El int\u00e9rprete funciona traduciendo el c\u00f3digo a c\u00f3digo m\u00e1quina cada vez que se ejecuta. Por lo tanto, si una l\u00ednea tarda LX segundos en ejecutarse, ejecutarla 10 veces costar\u00e1 X*10 segundos. Para operaciones de larga duraci\u00f3n, esto implica un alto consumo de tiempo de ejecuci\u00f3n.<\/p>\n<p>Bas\u00e1ndonos en los errores de CPython, ahora echemos un vistazo a 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\">Introducci\u00f3n a PyPy y sus caracter\u00edsticas<\/h2>\n<p>PyPy es una implementaci\u00f3n de Python similar a CPython, compatible y r\u00e1pida. &quot;Compatible&quot; significa que PyPy es compatible con CPython, lo que permite usar casi todos los comandos de CPython en PyPy. Como se mencion\u00f3 aqu\u00ed, existen algunas diferencias de compatibilidad. La mayor ventaja de PyPy es su velocidad. PyPy es mucho m\u00e1s r\u00e1pido que CPython. M\u00e1s adelante veremos algunas pruebas en las que PyPy funciona aproximadamente 7 veces m\u00e1s r\u00e1pido. En algunos casos, incluso puede ser decenas o cientos de veces m\u00e1s r\u00e1pido que CPython. Entonces, \u00bfc\u00f3mo logra PyPy su velocidad?<\/p>\n<h5 id=\"%d8%b3%d8%b1%d8%b9%d8%aa\">Velocidad<\/h5>\n<p>PyPy utiliza un compilador justo a tiempo (JIT) que puede acelerar dr\u00e1sticamente los scripts de Python. El tipo de compilaci\u00f3n utilizado en CPython es adelantado en el tiempo (AOT), lo que significa que todo el c\u00f3digo se traduce a bytecode antes de su ejecuci\u00f3n. El JIT solo traduce el c\u00f3digo en tiempo de ejecuci\u00f3n, solo cuando es necesario.<\/p>\n<p>El c\u00f3digo fuente puede contener bloques de c\u00f3digo que no se ejecutan en absoluto, pero que se traducen mediante el compilador AOT. Esto resulta en tiempos de procesamiento m\u00e1s lentos. Cuando el c\u00f3digo fuente es extenso y contiene miles de l\u00edneas, usar JIT marca una gran diferencia. Con AOT, se traduce todo el c\u00f3digo fuente, lo que requiere mucho tiempo. Con JIT, solo se ejecutan las partes necesarias del c\u00f3digo, lo que lo hace mucho m\u00e1s r\u00e1pido.<\/p>\n<p>Despu\u00e9s de que PyPy traduce un fragmento de c\u00f3digo, este se almacena en cach\u00e9. Esto significa que el c\u00f3digo se traduce solo una vez y se utiliza posteriormente. El int\u00e9rprete de CPython repite la traducci\u00f3n cada vez que se ejecuta el c\u00f3digo, lo cual es otra raz\u00f3n de su lentitud.<\/p>\n<h5 id=\"%d8%a8%db%8c-%d8%b2%d8%ad%d9%85%d8%aa\">F\u00e1cil<\/h5>\n<p>PyPy no es la \u00fanica forma de mejorar el rendimiento de los scripts de Python, pero es la m\u00e1s sencilla. Por ejemplo, Cython puede usarse para acelerar la asignaci\u00f3n de tipos de C a variables. El problema es que Cython requiere que el desarrollador revise y optimice manualmente el c\u00f3digo fuente. Esto es tedioso y aumenta su complejidad a medida que aumenta el tama\u00f1o del c\u00f3digo. Al usar PyPy, se ejecuta c\u00f3digo Python normal mucho m\u00e1s r\u00e1pido y sin esfuerzo.<\/p>\n<h5 id=\"%d8%a8%d8%af%d9%88%d9%86-%d9%be%d8%b4%d8%aa%d9%87\">Sin pila<\/h5>\n<p>Python est\u00e1ndar utiliza la pila de C. Esta pila almacena la secuencia de funciones que se invocan entre s\u00ed (retornos). Dado que la pila tiene un tama\u00f1o limitado, el n\u00famero de llamadas a funciones est\u00e1 limitado.<\/p>\n<p>PyPy usa Stackless Python, una implementaci\u00f3n de Python que no utiliza la pila de C. En su lugar, almacena las llamadas a funciones en la pila junto con los objetos. El tama\u00f1o de la pila es mayor que el del mont\u00f3n, lo que permite realizar m\u00e1s llamadas a funciones.<\/p>\n<p>Python sin pila tambi\u00e9n admite microhilos, que son mejores que los hilos de Python normales. En un hilo de Python sin pila, se pueden ejecutar miles de tareas llamadas &quot;tasklets&quot;, todas ejecut\u00e1ndose en un solo hilo.<\/p>\n<p>El uso de tasklets permite ejecutar tareas simult\u00e1neamente. La concurrencia significa que dos tareas se ejecutan simult\u00e1neamente y comparten los mismos recursos. Una tarea se ejecuta durante un tiempo y luego se detiene para dar paso a la segunda. Cabe destacar que esto es diferente del paralelismo, que implica ejecutar dos tareas independientes pero simult\u00e1neas.<\/p>\n<p>El uso de Tasklets reduce la cantidad de subprocesos creados, lo que reduce la sobrecarga que supone la gesti\u00f3n de todos estos subprocesos por parte del sistema operativo. Como resultado, acelerar la ejecuci\u00f3n alternando entre dos subprocesos requiere m\u00e1s tiempo que alternar entre dos tareas.<\/p>\n<p>El uso de Stackless Python tambi\u00e9n sent\u00f3 las bases para las continuaciones. Estas permiten guardar el estado de una tarea y restaurarlo posteriormente para continuarla. Cabe destacar que Stackless Python no se diferencia del Python est\u00e1ndar. Simplemente a\u00f1ade m\u00e1s funcionalidad. Todo lo disponible en Python est\u00e1ndar tambi\u00e9n estar\u00e1 disponible en Stackless Python.<\/p>\n<p>Despu\u00e9s de discutir los beneficios de PyPy, hablemos de sus limitaciones en la siguiente secci\u00f3n.<\/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\">Limitaciones de PyPy<\/h2>\n<p>Si bien puedes usar CPython en cualquier m\u00e1quina y cualquier arquitectura de CPU, PyPy tiene un soporte relativamente limitado.<\/p>\n<p>Aqu\u00ed est\u00e1n las arquitecturas de CPU soportadas y mantenidas por PyPy (fuente):<\/p>\n<ul>\n<li>x86 (IA-32) y x86_64<\/li>\n<li>Plataformas ARM (ARMv6 o ARMv7, con VFPv3)<\/li>\n<li>AArch64<\/li>\n<li>PowerPC de 64 bits, tanto little endian como big endian<\/li>\n<li>Sistema Z (s390x)<\/li>\n<\/ul>\n<p>PyPy no funciona en todas las distribuciones de Linux, por lo que debe asegurarse de usar una de las distribuciones compatibles. Ejecutar el binario de PyPy para Linux en una distribuci\u00f3n no compatible devolver\u00e1 un error. PyPy solo es compatible con las versiones de Python 2 y Python 3: PyPy 2.7 y PyPy 3.6.<\/p>\n<p>Si el c\u00f3digo que se ejecuta en PyPy es Python puro, la aceleraci\u00f3n que ofrece PyPy suele ser significativa. Sin embargo, si el c\u00f3digo incluye extensiones de C como NumPy, PyPy puede incluso aumentar el tiempo. El proyecto PyPy se encuentra en desarrollo activo y, por lo tanto, podr\u00eda ofrecer un mejor soporte para las extensiones de C en el futuro.<\/p>\n<p>PyPy no es compatible con varios frameworks populares de Python, como Kivy. Kivy permite ejecutar CPython en todas las plataformas, incluyendo Android e iOS. Esto significa que PyPy no puede ejecutarse en dispositivos m\u00f3viles.<\/p>\n<p>Ahora que hemos visto las ventajas y limitaciones de PyPy, expliquemos c\u00f3mo ejecutar PyPy en Ubuntu.<\/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\">Ejecutando PyPy en Ubuntu<\/h2>\n<p>Puedes ejecutar PyPy en Mac, Linux o Windows, pero hablaremos sobre su ejecuci\u00f3n en Ubuntu. Es importante tener en cuenta que los binarios de PyPy para Linux solo son compatibles con distribuciones de Linux espec\u00edficas. Puedes consultar los binarios de PyPy disponibles y sus distribuciones compatibles en esta p\u00e1gina. Por ejemplo, PyPy (o Python 2.7 o Python 3.6) solo es compatible con tres versiones de Ubuntu: 18.04, 16.04 y 14.04. Si tienes la \u00faltima versi\u00f3n de Ubuntu (19.10), no podr\u00e1s ejecutar PyPy en ella. Intentar ejecutar PyPy en una distribuci\u00f3n no compatible mostrar\u00e1 este error:<\/p>\n<p>Los binarios de PyPy vienen como archivos comprimidos. Solo tienes que descomprimir el archivo que descargaste. Dentro de la carpeta descomprimida hay una carpeta llamada bin donde se encuentra el archivo ejecutable de PyPy. Uso Python 3.6, por lo que el archivo se llama pypy3. En Python 2.7, simplemente se llama pypy.<\/p>\n<p>Para CPython, si desea ejecutar Python 3 desde la terminal, simplemente introduzca el comando python3. Para ejecutar PyPy, simplemente ejecute el comando pypy3.<\/p>\n<p>Como se muestra en la siguiente figura, al introducir el comando pypy3 en la terminal, es posible que aparezca el mensaje &quot;pypy3&quot; no encontrado. Esto se debe a que la ruta de acceso de PyPy no se ha a\u00f1adido a la variable de entorno PATH. El comando que realmente funciona es .\/pypy3, dado que la ruta actual en la terminal se encuentra dentro del directorio bin de PyPy. El punto . se refiere al directorio actual y se a\u00f1ade la barra \/ para acceder a alg\u00fan elemento del directorio actual. Al ejecutar el comando .\/pypy3, Python se ejecuta correctamente.<\/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>Ahora puedes trabajar con Python como siempre, aprovechando PyPy. Por ejemplo, podemos crear un script simple de Python que sume 1000 n\u00fameros y ejecutarlo con PyPy. El c\u00f3digo es el siguiente.<\/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>Si este script se llama test.py, puedes simplemente ejecutarlo usando el siguiente comando (asumiendo que el archivo Python est\u00e1 ubicado dentro de la carpeta bin de PyPy, que es la misma ubicaci\u00f3n que el comando pypy3).<\/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>La siguiente figura muestra el resultado de ejecutar el c\u00f3digo anterior.<\/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\">Tiempo de ejecuci\u00f3n de PyPy vs. CPython<\/h2>\n<p>Para comparar el tiempo de ejecuci\u00f3n de PyPy y CPython para la suma de 1000 n\u00fameros, el c\u00f3digo para medir el tiempo cambia de la siguiente manera.<\/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>Para PyPy, el tiempo es cercano a 0,00045 segundos, en comparaci\u00f3n con los 0,0002 segundos de CPython (ejecut\u00e9 el c\u00f3digo en mi m\u00e1quina Core i7-6500U a 2,5 GHz). En este caso, CPython tarda menos que PyPy, lo cual es previsible, ya que no se trata de una tarea de larga duraci\u00f3n. Si el c\u00f3digo a\u00f1adiera un mill\u00f3n de n\u00fameros en lugar de 1000, PyPy ganar\u00eda. En este caso, PyPy tardar\u00eda 0,00035 segundos y CPython 0,1 segundos. La ventaja de PyPy es ahora evidente. Esto deber\u00eda darte una idea de lo lento que es CPython para tareas de larga duraci\u00f3n.<\/p>\n<h2 id=\"%d9%86%d8%aa%db%8c%d8%ac%d9%87\">Resultado<\/h2>\n<p>Este tutorial presenta PyPy, la implementaci\u00f3n m\u00e1s r\u00e1pida de Python. Su principal ventaja es su compilaci\u00f3n justo a tiempo (JIT), que almacena en cach\u00e9 el c\u00f3digo m\u00e1quina compilado para evitar que se vuelva a ejecutar. Tambi\u00e9n se destacan sus limitaciones, la principal de las cuales es que funciona bien con c\u00f3digo Python puro, pero no es eficiente con extensiones de C.<\/p>\n<p>Tambi\u00e9n vimos c\u00f3mo se ejecuta PyPy en Ubuntu y comparamos los tiempos de ejecuci\u00f3n de CPython y PyPy, destacando el rendimiento de PyPy en tareas de larga duraci\u00f3n. Mientras tanto, CPython a\u00fan podr\u00eda superar a PyPy en tareas de corta duraci\u00f3n. Exploraremos m\u00e1s comparaciones entre PyPy, CPython y Cython en pr\u00f3ximos art\u00edculos.<\/p>","protected":false},"excerpt":{"rendered":"Introducci\u00f3n El lenguaje de programaci\u00f3n Python es una interfaz que se puede implementar de varias maneras.\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\/es\/tutorials\/getting-started-with-pypy\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minuto\" \/>\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\":\"es\",\"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\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/getting-started-with-pypy\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\"},{\"@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\":\"es\",\"@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\\\/es\\\/author\\\/admin\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Introducci\u00f3n a PyPy - Blog de ITPiran","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\/es\/tutorials\/getting-started-with-pypy\/","og_locale":"es_ES","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\/es\/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":{"Escrito por":"admin","Tiempo de lectura":"1 minuto"},"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":"es","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":"Introducci\u00f3n a PyPy - Blog de 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":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.itpiran.net\/blog\/tutorials\/getting-started-with-pypy\/"]}]},{"@type":"ImageObject","inLanguage":"es","@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":"Blog de ITPiran","description":"Noticias y art\u00edculos sobre comercio sostenible en Ir\u00e1n","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":"es"},{"@type":"Organization","@id":"https:\/\/www.itpiran.net\/blog\/#organization","name":"Blog sobre negocios iran\u00edes sostenibles","alternateName":"ITPIran Blog","url":"https:\/\/www.itpiran.net\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@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":"administraci\u00f3n","url":"https:\/\/www.itpiran.net\/blog\/es\/author\/admin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/posts\/16211","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/comments?post=16211"}],"version-history":[{"count":2,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/posts\/16211\/revisions"}],"predecessor-version":[{"id":16217,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/posts\/16211\/revisions\/16217"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/media\/16212"}],"wp:attachment":[{"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/media?parent=16211"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/categories?post=16211"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/tags?post=16211"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}