Extensions are just Python modules with a special function:
def load_ipython_extension(ip):
do_anything()
%load_ext module
imports the module, and calls module.load_ipython_extension(ip)
with the IPython instance.
This allows modules or standalone extensions to manipulate IPython. Most often, extensions define new magics or work with the interactive namespace.
One example of an extension is cythonmagic
, which currently ships with IPython.
This defines a few magics for executing Cython code interactively.
In [1]:
%%cython
cpdef noop():
pass
In [2]:
%load_ext cythonmagic
In [3]:
%%cython
cimport numpy
cpdef cysum(numpy.ndarray[double] A):
"""Compute the sum of an array"""
cdef double a=0
for i in range(A.shape[0]):
a += A[i]
return a
In [4]:
def pysum(A):
"""Compute the sum of an array"""
a = 0
for i in range(A.shape[0]):
a += A[i]
return a
In [5]:
import numpy as np
In [6]:
for sz in (100, 1000, 10000):
A = np.random.random(sz)
print "Python %i" % sz,
%timeit pysum(A)
print "np.sum %i" % sz,
%timeit A.sum()
print "Cython %i" % sz,
%timeit cysum(A)
cythonmagic
is just a module, let's see what it's load_ipython_extension
function looks like
In [7]:
from IPython.extensions import cythonmagic
In [8]:
cythonmagic.load_ipython_extension??
In [9]:
cythonmagic.CythonMagics??
Loading an extension can do as much or as little as you want.
Since we have been defining our timer magics, let's create an extension to make them available in any IPython session.
In [10]:
%pycat soln/mymagics.py
%install_ext
is a function that can take any file path or URL, and puts the target into IPYTHONDIR/extensions
In [11]:
%install_ext soln/mymagics.py
In [12]:
%load_ext mymagics
In [13]:
import time
%tic
time.sleep(0.1)
%toc
In [14]:
%nbrun Sample
For some example extensions, see this repository.
Now we can get our magics with a single %load_ext
call.
Let's move on to Configuring IPython,
so we can see how to load our extension at startup.