Comandos mágicos de IPython

Comandos mágicos de IPython



Las dos secciones anteriores mostraron cómo IPython le permite usar y explorar Python de manera eficiente e interactiva. Aquí comenzaremos a discutir algunas de las mejoras que agrega IPython además de la sintaxis normal de Python. Estos se conocen en IPython como comandos mágicos y tienen como prefijo el carácter %. Estos comandos mágicos están diseñados para resolver de manera sucinta varios problemas comunes en el análisis de datos estándar. Los comandos mágicos vienen en dos sabores: líneas mágicas, que se indican con un único prefijo % y operan en una sola línea de entrada, y magia de celda, que se indican con un prefijo doble %% y operan en varias líneas de entrada. Demostraremos y discutiremos algunos ejemplos breves aquí, y volveremos a una discusión más enfocada de varios comandos mágicos útiles más adelante en este capítulo.


Pegar bloques de código: %paste y %cpaste

Cuando se trabaja en el intérprete de IPython, un problema común es que pegar bloques de código de varias líneas puede provocar errores inesperados, especialmente cuando se trata de marcas de intérprete y sangría. Un caso común es que encuentre un código de ejemplo en un sitio web y desee pegarlo en su intérprete. Considere la siguiente función simple:


>>> def donothing(x):
...     return x


El código está formateado como aparecería en el intérprete de Python, y si copia y pega esto directamente en IPython obtendrá un error:


In [2]: >>> def donothing(x):
   ...:     ...     return x
   ...:     
  File "<ipython-input-20-5a66c8964687>", line 2
    ...     return x
                 ^
SyntaxError: invalid syntax


En el pegado directo, el intérprete se confunde con los caracteres adicionales del mensaje. Pero no temas: la función mágica %paste de IPython está diseñada para manejar este tipo exacto de entrada marcada de varias líneas:


In [3]: %paste
>>> def donothing(x):
...     return x

## -- End pasted text --


El comando %paste ingresa y ejecuta el código, por lo que ahora la función está lista para ser utilizada:


In [4]: donothing(10)
Out[4]: 10


Un comando con una intención similar es %cpaste, que abre un indicador interactivo de varias líneas en el que puede pegar uno o más fragmentos de código para que se ejecuten en un lote:


In [5]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:>>> def donothing(x):
:...     return x
:--


Estos comandos mágicos, como otros que veremos, ponen a disposición una funcionalidad que sería difícil o imposible en un intérprete estándar de Python.


Ejecutando código externo: %run

A medida que comience a desarrollar un código más extenso, es probable que se encuentre trabajando tanto en IPython para la exploración interactiva como en un editor de texto para almacenar el código que desea reutilizar. En lugar de ejecutar este código en una nueva ventana, puede ser conveniente ejecutarlo dentro de su sesión de IPython. Esto se puede hacer con la magia %run.


Por ejemplo, imagine que ha creado un archivo myscript.py con el siguiente contenido:


#-------------------------------------
# file: myscript.py

def square(x):
    """square a number"""
    return x ** 2

for N in range(1, 4):
    print(N, "squared is", square(N))


Puede ejecutar esto desde su sesión de IPython de la siguiente manera:


In [6]: %run myscript.py
1 squared is 1
2 squared is 4
3 squared is 9


Tenga en cuenta también que después de ejecutar este script, todas las funciones definidas en él están disponibles para su uso en su sesión de IPython:


In [7]: square(5)
Out[7]: 25


Hay varias opciones para ajustar cómo se ejecuta su código; puede ver la documentación de la forma habitual, escribiendo %run? en el intérprete de IPython.


Ejecución del código de tiempo: %timeit

Otro ejemplo de una función mágica útil es %timeit, que determinará automáticamente el tiempo de ejecución de la declaración de Python de una sola línea que le sigue. Por ejemplo, es posible que queramos comprobar el rendimiento de una lista de comprensión:


In [8]: %timeit L = [n ** 2 for n in range(1000)]
1000 loops, best of 3: 325 µs per loop


El beneficio de %timeit es que, para comandos cortos, realizará automáticamente múltiples ejecuciones para obtener resultados más sólidos. Para declaraciones de varias líneas, agregar un segundo signo % lo convertirá en una celda mágica que puede manejar múltiples líneas de entrada. Por ejemplo, aquí está la construcción equivalente con un for-loop:


In [9]: %%timeit
   ...: L = []
   ...: for n in range(1000):
   ...:     L.append(n ** 2)
   ...: 
1000 loops, best of 3: 373 µs per loop


Podemos ver de inmediato que las listas por comprensión son aproximadamente un 10% más rápidas que el for equivalente de construcción de bucle en este caso. Exploraremos %timeit y otros enfoques para el código de temporización y creación de perfiles en Código de creación de perfiles y temporización.


Ayuda sobre las funciones mágicas:
?, %magic y %lsmagic

Al igual que las funciones normales de Python, las funciones mágicas de IPython tienen cadenas de documentación, y se puede acceder a esta documentación útil de manera estándar. Entonces, por ejemplo, para leer la documentación de la magia %timeit simplemente escriba esto:


In [10]: %timeit?


Se puede acceder de manera similar a la documentación para otras funciones. Para acceder a una descripción general de las funciones mágicas disponibles, incluidos algunos ejemplos, puede escribir esto:


In [11]: %magic


Para obtener una lista rápida y sencilla de todas las funciones mágicas disponibles, escriba esto:


In [12]: %lsmagic


Finalmente, mencionaré que es bastante sencillo definir sus propias funciones mágicas si lo desea. No lo discutiremos aquí, pero si está interesado, consulte las referencias enumeradas en Más recursos de IPython.


JeshuaNomics

JeshuaNomics - DataScience es una web de divulgación donde se puede encontrar material formativo en ciencia de datos y programación estadística (R, Python y SQL).

Publicar un comentario (0)
Artículo Anterior Artículo Siguiente