{"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\/es\/tutorials\/boosting-python-scripts-cython\/","title":{"rendered":"Mejorando scripts de Python con Cython"},"content":{"rendered":"<h2 id=\"%d9%85%d9%82%d8%af%d9%85%d9%87\">Introducci\u00f3n<\/h2>\n<p>Python es quiz\u00e1s uno de los lenguajes de programaci\u00f3n m\u00e1s populares hoy en d\u00eda, pero sin duda no es el m\u00e1s eficiente. Especialmente en el mundo del aprendizaje autom\u00e1tico, los usuarios sacrifican eficiencia por la facilidad de uso que ofrece Python.<\/p>\n<p>Pero eso no significa que no puedas acelerar las cosas de otras maneras. Cython es una forma sencilla de reducir el tiempo de c\u00e1lculo de los scripts de Python sin sacrificar la funcionalidad que se consigue f\u00e1cilmente con Python.<\/p>\n<p>Este tutorial te ense\u00f1ar\u00e1 a usar Cython para acelerar scripts de Python. Abordaremos una tarea sencilla pero computacionalmente costosa: crear un bucle `for` que recorra una lista de mil millones de n\u00fameros en Python y los sume. Dado que el tiempo es crucial al ejecutar c\u00f3digo en dispositivos con recursos limitados, exploraremos este problema considerando c\u00f3mo implementar c\u00f3digo Python en Cython en una Raspberry Pi (RPi). Cython marca una diferencia significativa en la velocidad de c\u00e1lculo; es como comparar un proceso lento con uno r\u00e1pido.<\/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\">Requisitos previos para optimizar scripts de Python con Cython<\/h2>\n<ul>\n<li>Conocimientos b\u00e1sicos de Python: Familiaridad con la sintaxis, las funciones, los tipos de datos y los m\u00f3dulos de Python.<\/li>\n<li>Comprender conceptos b\u00e1sicos de C\/C++: Familiaridad con conceptos b\u00e1sicos de C o C++ como punteros, tipos de datos y estructuras de control.<\/li>\n<li>Entorno de desarrollo de Python: Instale Python (preferiblemente Python 3.x) con un administrador de paquetes como pip.<\/li>\n<li>Instalar Cython: Instale Cython con el comando pip install cython.<\/li>\n<li>Conocimientos b\u00e1sicos de terminal\/l\u00ednea de comandos: Capacidad para navegar y ejecutar comandos en una terminal o l\u00ednea de comandos.<\/li>\n<\/ul>\n<p>Estos requisitos previos te ayudar\u00e1n a prepararte para comenzar a optimizar c\u00f3digo Python usando Cython.<\/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 y CPython<\/h2>\n<p>Mucha gente desconoce que lenguajes como Python se implementan en otros lenguajes. Por ejemplo, la implementaci\u00f3n de Python en C se conoce como CPython. Cabe destacar que es diferente de Cython. Para obtener m\u00e1s informaci\u00f3n sobre las distintas implementaciones de Python, puedes leer este art\u00edculo.<\/p>\n<p>La implementaci\u00f3n predeterminada y m\u00e1s popular de Python es C-Python. Su uso tiene una ventaja importante: C es un lenguaje compilado, y su c\u00f3digo se convierte en c\u00f3digo m\u00e1quina que la unidad central de procesamiento (CPU) ejecuta directamente. Ahora bien, cabe preguntarse: si C es un lenguaje compilado, \u00bfsignifica eso que Python tambi\u00e9n lo es?<\/p>\n<p>La implementaci\u00f3n de Python en C (CPython) 100% no se compila ni se interpreta. De hecho, tanto la compilaci\u00f3n como la interpretaci\u00f3n ocurren durante la ejecuci\u00f3n de un script de Python. Para aclarar esto, veamos los pasos que implica la ejecuci\u00f3n de un script de Python:<\/p>\n<ol>\n<li>Compilar c\u00f3digo fuente usando CPython para generar bytecode.<\/li>\n<li>Interpretaci\u00f3n de bytecode por el int\u00e9rprete CPython<\/li>\n<li>Ejecutar la salida del int\u00e9rprete de CPython en la m\u00e1quina virtual de CPython<\/li>\n<\/ol>\n<p>El proceso de compilaci\u00f3n ocurre cuando CPython compila el c\u00f3digo fuente (archivo .py) y genera el bytecode de CPython (archivo .pyc). Este bytecode es interpretado por el int\u00e9rprete de CPython y el resultado se ejecuta en la m\u00e1quina virtual de CPython. Como se muestra en los pasos anteriores, la ejecuci\u00f3n de un script de Python implica tanto compilaci\u00f3n como interpretaci\u00f3n.<\/p>\n<p>El compilador de CPython genera bytecode una sola vez, pero el int\u00e9rprete se llama cada vez que se ejecuta el c\u00f3digo. Interpretar bytecode suele llevar mucho tiempo. Si usar un int\u00e9rprete ralentiza la ejecuci\u00f3n, \u00bfpor qu\u00e9 usarlo? La raz\u00f3n principal es que el int\u00e9rprete permite usar Python en distintos sistemas operativos. Dado que el bytecode se ejecuta independientemente de la m\u00e1quina en la m\u00e1quina virtual de CPython que se ejecuta en la CPU, se puede ejecutar en distintas m\u00e1quinas sin necesidad de modificaciones.<\/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>Si no se utiliza un int\u00e9rprete, el compilador de CPython generar\u00e1 c\u00f3digo m\u00e1quina que se ejecuta directamente en la CPU. Debido a que las distintas plataformas tienen instrucciones diferentes, el c\u00f3digo no se puede ejecutar en todas ellas.<\/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>En resumen, usar un compilador acelera el proceso, pero el int\u00e9rprete hace que el c\u00f3digo sea multiplataforma. Por lo tanto, una de las razones por las que Python es m\u00e1s lento que C es por el uso del int\u00e9rprete. Recuerda que el compilador se ejecuta solo una vez, mientras que el int\u00e9rprete se ejecuta cada vez que se ejecuta el c\u00f3digo.<\/p>\n<p>Python es mucho m\u00e1s lento que C, pero muchos programadores a\u00fan lo prefieren porque es mucho m\u00e1s f\u00e1cil de usar. Python oculta muchos detalles al programador, lo que puede evitar frustrantes tareas de depuraci\u00f3n. Por ejemplo, como Python es un lenguaje de tipado din\u00e1mico, no es necesario especificar el tipo de cada variable en el c\u00f3digo; Python lo infiere autom\u00e1ticamente. En cambio, en los lenguajes de tipado est\u00e1tico (como C, C++ o Java) es necesario especificar los tipos de las variables, como se muestra a continuaci\u00f3n.<\/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>Comp\u00e1rese con la siguiente implementaci\u00f3n en Python:<\/p>\n<p>El tipado din\u00e1mico facilita la codificaci\u00f3n, pero exige m\u00e1s a la m\u00e1quina para encontrar el tipo de dato correcto, lo que ralentiza el proceso de ejecuci\u00f3n.<\/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>En general, los lenguajes de alto nivel como Python son mucho m\u00e1s f\u00e1ciles de entender para los desarrolladores. Sin embargo, al ejecutar el c\u00f3digo, es necesario convertirlo a instrucciones de bajo nivel. Esta conversi\u00f3n requiere m\u00e1s tiempo, lo cual se sacrifica en aras de la facilidad de uso.<\/p>\n<p>Si el tiempo apremia, conviene usar comandos de bajo nivel. As\u00ed, en lugar de escribir c\u00f3digo en Python, que es la interfaz de usuario, se puede usar CPython, que internamente es Python implementado en C. Sin embargo, al hacerlo, la sensaci\u00f3n ser\u00e1 la de programar en C, no en Python.<\/p>\n<p>CPython es mucho m\u00e1s complejo. En CPython, todo est\u00e1 implementado en C. No hay forma de evitar la complejidad de C al programar. Por eso, muchos desarrolladores usan Cython. Pero \u00bfen qu\u00e9 se diferencia Cython de 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\">\u00bfEn qu\u00e9 se diferencia Cython?<\/h2>\n<p>Como se defini\u00f3 anteriormente, Cython es un lenguaje que ofrece lo mejor de ambos mundos: velocidad y facilidad de uso. Se puede seguir escribiendo c\u00f3digo Python, pero para acelerar la ejecuci\u00f3n, Cython permite reemplazar ciertas partes del c\u00f3digo Python con c\u00f3digo C. De esta forma, se combinan ambos lenguajes en un solo archivo. Cabe mencionar que todo lo que se puede implementar en Python es v\u00e1lido en Cython, aunque con algunas limitaciones.<\/p>\n<p>Un archivo Python normal tiene la extensi\u00f3n .py, mientras que un archivo Cython tiene la extensi\u00f3n .pyx. El mismo c\u00f3digo Python se puede escribir dentro de archivos .pyx, pero estos archivos tambi\u00e9n permiten usar c\u00f3digo Cython. Ten en cuenta que colocar c\u00f3digo Python en un archivo .pyx puede acelerar el proceso en comparaci\u00f3n con ejecutar el c\u00f3digo Python directamente, pero no ser\u00e1 tan r\u00e1pido como declarar los tipos de las variables. Por lo tanto, este tutorial no se centra \u00fanicamente en escribir c\u00f3digo Python dentro de un archivo .pyx, sino en realizar modificaciones que optimicen su ejecuci\u00f3n. Esto a\u00f1ade cierta complejidad a la programaci\u00f3n, pero ahorra mucho tiempo. Si tienes experiencia con la programaci\u00f3n en C, te resultar\u00e1 m\u00e1s f\u00e1cil.<\/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\">Citronizaci\u00f3n de c\u00f3digo Python simple<\/h2>\n<p>Para convertir c\u00f3digo Python a Cython, primero necesitas crear un archivo con la extensi\u00f3n . <code inline=\"\">.p\u00edxide<\/code> Crear en lugar de extensi\u00f3n <code inline=\"\">.py<\/code>. Dentro de este archivo, puede comenzar a escribir c\u00f3digo Python regular (tenga en cuenta que existen algunas limitaciones en el c\u00f3digo que acepta Cython, las cuales se explican en la documentaci\u00f3n de Cython).<\/p>\n<p>Antes de continuar, aseg\u00farese de que Cython est\u00e9 instalado. Puede hacerlo utilizando el siguiente comando.<\/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>Para generar el archivo .pyd\/.so, primero necesitamos compilar el archivo Cython. El archivo .pyd\/.so representa un m\u00f3dulo que se importar\u00e1 posteriormente. Se utiliza un archivo setup.py para compilar el archivo Cython. Cree este archivo e incluya el siguiente c\u00f3digo. Usaremos la funci\u00f3n distutils.core.setup() para llamar a la funci\u00f3n Cython.Build.cythonize(), que compilar\u00e1 el archivo .pyx con Cython. Esta funci\u00f3n acepta la ruta al archivo que se desea compilar con Cython. Aqu\u00ed, se asume que el archivo setup.py se encuentra en la misma ubicaci\u00f3n que el archivo test_cython.pyx.<\/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>Para generar el archivo Cython, introduzca el siguiente comando en la l\u00ednea de comandos. Se espera que el directorio actual de la l\u00ednea de comandos sea el mismo que el del archivo setup.py.<\/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>Una vez finalizado este comando, se crear\u00e1n dos archivos junto al archivo .pyx. El primero tendr\u00e1 la extensi\u00f3n .c y el segundo la extensi\u00f3n .pyd (o similar, seg\u00fan el sistema operativo). Para usar el archivo generado, basta con importar el m\u00f3dulo test_cython y se mostrar\u00e1 el mensaje \u201cHola Cython\u201d, como se muestra a continuaci\u00f3n.<\/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>Ya hemos compilado correctamente el c\u00f3digo Python con Cyton. En la siguiente secci\u00f3n veremos c\u00f3mo compilar un archivo .pyx que contiene un bucle.<\/p>\n<p>Citonizaci\u00f3n de un bucle &quot;for&quot;\u201c<\/p>\n<p>Ahora optimicemos nuestra tarea anterior: un bucle `for` que recorre un mill\u00f3n de n\u00fameros y los suma. Comencemos analizando la eficiencia del bucle en s\u00ed. El m\u00f3dulo `time` nos permite estimar cu\u00e1nto tiempo tarda en ejecutarse.<\/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>En un archivo .pyx, el tiempo promedio de ejecuci\u00f3n para 3 pruebas es de 0,0281 segundos. El c\u00f3digo se ejecuta en una m\u00e1quina con un procesador Core i7-6500U a 2,5 GHz y 16 GB de RAM DDR3.<\/p>\n<p>Comp\u00e1rese esto con el tiempo de ejecuci\u00f3n de un archivo Python t\u00edpico, que tiene un promedio de 0,0411 segundos. Esto significa que Cython es solo 1,46 veces m\u00e1s r\u00e1pido que Python para iteraciones, incluso sin tener que modificar el bucle `for` para que se ejecute a la velocidad de C.<\/p>\n<p>Ahora agreguemos la suma. Para ello, utilizaremos la funci\u00f3n 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>Cabe destacar que ambos scripts devuelven el mismo valor: 499999500000. En Python, su ejecuci\u00f3n tarda un promedio de 0,1183 segundos (seg\u00fan tres pruebas). En Cython, es 1,35 veces m\u00e1s r\u00e1pido, con un promedio de 0,0875 segundos.<\/p>\n<p>Ahora veamos otro ejemplo donde el bucle comienza en 0 y recorre mil millones de n\u00fameros.<\/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>El script de Cython finaliz\u00f3 en aproximadamente 85 segundos (1,4 minutos), mientras que el de Python tard\u00f3 unos 115 segundos (1,9 minutos). En ambos casos, el proceso es muy lento. \u00bfQu\u00e9 sentido tiene usar Cython si una tarea tan sencilla tarda m\u00e1s de un minuto? Cabe destacar que esto es un fallo nuestro, no de Cython.<\/p>\n<p>Como se mencion\u00f3 anteriormente, escribir c\u00f3digo Python dentro de un script Cython (.pyx) representa una mejora, pero no supone una diferencia significativa en el tiempo de ejecuci\u00f3n. Necesitamos realizar algunos cambios en el c\u00f3digo Python dentro del script Cython. Lo primero que debemos hacer es declarar expl\u00edcitamente el tipo de datos de las variables utilizadas.<\/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\">Asignaci\u00f3n de tipos de datos C a variables<\/h2>\n<p>Como en el c\u00f3digo anterior, se utilizan 5 variables: total, k, t1, t2 y t. El tipo de dato de todas estas variables se infiere impl\u00edcitamente, lo que aumenta el tiempo de c\u00e1lculo. Para ahorrar tiempo, asignemos el tipo de dato directamente desde el lenguaje C.<\/p>\n<p>La variable `total` es de tipo `unsigned long long int`. Es un entero porque la suma de todos los n\u00fameros es un entero, y es sin signo porque la suma siempre ser\u00e1 positiva. \u00bfPor qu\u00e9 `long long`? Porque la suma de todos los n\u00fameros es muy grande, as\u00ed que se usa `long long` para que la variable sea lo m\u00e1s grande posible.<\/p>\n<p>El tipo de datos asignado a la variable k es int y a las tres variables restantes t1, t2 y t se les asigna el tipo de datos float.<\/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>Observa que la precisi\u00f3n definida en la \u00faltima instrucci\u00f3n print est\u00e1 establecida en 100 y todos estos n\u00fameros son cero (ver la siguiente imagen). Esto es lo que podemos esperar al usar Cython. Mientras que Python tarda m\u00e1s de 1,9 minutos, Cython es instant\u00e1neo. Ni siquiera dir\u00eda que es 1000 o 100\u00a0000 veces m\u00e1s r\u00e1pido que Python; prob\u00e9 con diferentes precisiones para el tiempo impreso y aun as\u00ed no aparece ning\u00fan n\u00famero.<\/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>Ten en cuenta que tambi\u00e9n puedes crear una variable entera para almacenar el valor que se pasa a la funci\u00f3n `range()`. Esto mejorar\u00e1 a\u00fan m\u00e1s el rendimiento. El nuevo c\u00f3digo se muestra a continuaci\u00f3n, donde el valor se almacena en la variable entera `maxval`.<\/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>Ahora que hemos visto c\u00f3mo aumentar el rendimiento de los scripts de Python usando Cython, apliquemos esto a la Raspberry Pi (RPi).<\/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\">Acceso a Raspberry Pi desde un ordenador personal<\/h2>\n<p>Si es la primera vez que usas tu Raspberry Pi, tendr\u00e1s que conectar tanto tu PC como tu RPi a una red. Puedes hacerlo conectando ambos dispositivos a un switch con DHCP (Protocolo de Configuraci\u00f3n Din\u00e1mica de Host) habilitado para asignar direcciones IP autom\u00e1ticamente. Una vez creada la red, podr\u00e1s acceder a tu RPi mediante la direcci\u00f3n IPv4 que se le haya asignado. \u00bfC\u00f3mo saber qu\u00e9 direcci\u00f3n IPv4 tiene tu RPi? No te preocupes, puedes usar un esc\u00e1ner de IP. En este tutorial, usar\u00e9 una aplicaci\u00f3n gratuita llamada Advanced IP Scanner.<\/p>\n<p>La interfaz de usuario de esta aplicaci\u00f3n es la siguiente. Esta aplicaci\u00f3n acepta un rango de direcciones IPv4 para buscar y devuelve informaci\u00f3n sobre los dispositivos activos.<\/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>Necesitas introducir el rango de direcciones IPv4 de tu red local. Si no conoces este rango, ejecuta el comando `ipconfig` en Windows (o `ifconfig` en Linux) para encontrar la direcci\u00f3n IPv4 de tu ordenador (como se muestra en la figura a continuaci\u00f3n). En mi caso, la direcci\u00f3n IPv4 asignada al adaptador Wi-Fi de mi ordenador es 192.168.43.177 y la m\u00e1scara de subred es 255.255.255.0. Esto significa que el rango de direcciones IPv4 en la red va de 192.168.43.1 a 192.168.43.255. Como se muestra en la figura, la direcci\u00f3n IPv4 192.168.43.1 est\u00e1 asignada a la puerta de enlace. Ten en cuenta que la \u00faltima direcci\u00f3n IPv4 de este rango, 192.168.43.255, est\u00e1 reservada para mensajes de difusi\u00f3n. Entonces, el rango que debe buscar comienza en 192.168.43.2 y termina en 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>Seg\u00fan el resultado del escaneo que se muestra en la siguiente figura, la direcci\u00f3n IPv4 asignada a la RPi es 192.168.43.63. Esta direcci\u00f3n IPv4 se puede utilizar para establecer una sesi\u00f3n Secure Shell (SSH).<\/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>Para establecer una sesi\u00f3n SSH, utilizar\u00e9 un software gratuito llamado MobaXterm. La interfaz de usuario de este programa es la siguiente.<\/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>Para crear una sesi\u00f3n SSH, simplemente haga clic en el bot\u00f3n Sesi\u00f3n en la esquina superior izquierda. Aparecer\u00e1 una nueva ventana como se muestra a continuaci\u00f3n.<\/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>Desde esta ventana, haga clic en el bot\u00f3n SSH de la esquina superior izquierda para abrir la ventana que se muestra a continuaci\u00f3n. Introduzca la direcci\u00f3n IPv4 y el nombre de usuario de la Raspberry Pi (que por defecto es \u00abpi\u00bb) y haga clic en Aceptar para iniciar la sesi\u00f3n.<\/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>Tras hacer clic en el bot\u00f3n Aceptar, aparecer\u00e1 una nueva ventana donde deber\u00e1 introducir la contrase\u00f1a. La contrase\u00f1a predeterminada es raspberrypi. Tras iniciar sesi\u00f3n, aparecer\u00e1 la siguiente ventana. El panel izquierdo le permitir\u00e1 navegar f\u00e1cilmente por los directorios de su Raspberry Pi. Tambi\u00e9n dispone de una l\u00ednea de comandos para introducir comandos.<\/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\">Usando Cython con Raspberry Pi<\/h2>\n<p>Crea un archivo nuevo y cambia su extensi\u00f3n a .pyx para escribir el c\u00f3digo del ejemplo anterior. En la barra lateral izquierda encontrar\u00e1s opciones para crear archivos y directorios. Puedes usar el icono de nuevo archivo para simplificar el proceso, como se muestra en la imagen a continuaci\u00f3n. Cre\u00e9 un archivo llamado test_cython.pyx en el directorio ra\u00edz de la Raspberry Pi.<\/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>Haz doble clic en el archivo para abrirlo, pega el c\u00f3digo y gu\u00e1rdalo. A continuaci\u00f3n, debemos crear el archivo setup.py, que ser\u00e1 exactamente como lo vimos anteriormente. Despu\u00e9s, debemos ejecutar el siguiente comando para compilar el script de Cython.<\/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>Una vez que este comando se complete correctamente, encontrar\u00e1 los archivos de salida en el panel izquierdo, como se muestra en la siguiente figura. Tenga en cuenta que la extensi\u00f3n del m\u00f3dulo a importar ahora es .so, ya que ya no estamos usando Windows.<\/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>Ahora activemos Python e importemos el m\u00f3dulo, como se muestra a continuaci\u00f3n. Se obtienen los mismos resultados que en un PC; el tiempo de ejecuci\u00f3n es pr\u00e1cticamente nulo.<\/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\">Resultado<\/h2>\n<p>Este tutorial analiz\u00f3 c\u00f3mo usar Cython para reducir el tiempo de c\u00e1lculo al ejecutar scripts de Python. Mostraremos un ejemplo del uso de un bucle. <code inline=\"\">para<\/code> Analizamos la suma de todos los elementos de una lista de mil millones de n\u00fameros en Python y comparamos el tiempo de ejecuci\u00f3n con y sin la declaraci\u00f3n de variables. Mientras que este proceso tarda casi dos minutos en Python puro, al usar Cython y declarar variables est\u00e1ticas, se ejecuta pr\u00e1cticamente al instante.<\/p>","protected":false},"excerpt":{"rendered":"Introducci\u00f3n. Python puede ser uno de los lenguajes de programaci\u00f3n m\u00e1s populares hoy en d\u00eda, pero definitivamente no es el m\u00e1s eficiente. Especialmente en el mundo de\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\/es\/tutorials\/boosting-python-scripts-cython\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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=\"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=\"20 minutos\" \/>\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\":\"es\",\"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\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.itpiran.net\\\/blog\\\/tutorials\\\/boosting-python-scripts-cython\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"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":"Mejorando scripts de Python con Cython - 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\/boosting-python-scripts-cython\/","og_locale":"es_ES","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\/es\/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":{"Escrito por":"admin","Tiempo de lectura":"20 minutos"},"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":"es","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":"Mejorando scripts de Python con Cython - Blog de 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":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.itpiran.net\/blog\/tutorials\/boosting-python-scripts-cython\/"]}]},{"@type":"ImageObject","inLanguage":"es","@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":"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\/16496","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=16496"}],"version-history":[{"count":1,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/posts\/16496\/revisions"}],"predecessor-version":[{"id":16514,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/posts\/16496\/revisions\/16514"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/media\/16513"}],"wp:attachment":[{"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/media?parent=16496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/categories?post=16496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.itpiran.net\/blog\/es\/wp-json\/wp\/v2\/tags?post=16496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}