Поиск по блогу

четверг, 6 марта 2014 г.

Customizing IPython - Extensions (9) "... SciPy2013 Tutorial, Part 3 of 3"

Это практикум по раширениям (extensions) IPython - модулям со специальными функциями. Видео для этой темы нет..., только файл. Его я просто скопировал (на будущее). Здесь есть %load_ext module, %%cython ...let's create an extension...
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
ERROR: Cell magic `%%cython` not found.

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)
Python 100 10000 loops, best of 3: 55.8 µs per loop
np.sum 100 100000 loops, best of 3: 5.77 µs per loop
Cython 100 1000000 loops, best of 3: 1.06 µs per loop
Python 1000 1000 loops, best of 3: 507 µs per loop
np.sum 1000 100000 loops, best of 3: 6.69 µs per loop
Cython 1000 1000000 loops, best of 3: 1.87 µs per loop
Python 10000 100 loops, best of 3: 5.19 ms per loop
np.sum 10000 100000 loops, best of 3: 15.2 µs per loop
Cython 10000 100000 loops, best of 3: 9.91 µs per loop

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??

Our own extension

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
Installed mymagics.py. To use it, type:
  %load_ext mymagics

In [12]:
%load_ext mymagics
In [13]:
import time
%tic
time.sleep(0.1)
%toc
101 ms

In [14]:
%nbrun Sample
hello

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.


Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий