IPython – an interactive shell
Scientists and engineers are used to experiment. Scientists created IPython with experimentation in mind. Many view the interactive environment that IPython provides as a direct answer to MATLAB, Mathematica, and Maple. You can find more information, including installation instructions, at http://ipython.org/.
IPython is free, open source, and available for Linux, UNIX, Mac OS X, and Windows. The IPython authors only request that you cite IPython in any scientific work that uses IPython. The following is a list of the basic IPython features:
- Tab completion
- History mechanism
- Inline editing
- Ability to call external Python scripts with %run
- Access to system commands
- Pylab switch
- Access to Python debugger and profiler
The Pylab switch imports all the SciPy, NumPy, and matplotlib packages. Without this switch, we will have to import every package we need ourselves.
All we need to do is enter the following instruction on the command line:
$ ipython --pylab IPython 2.4.1 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. Using matplotlib backend: MacOSX In [1]: quit()
The quit()
command or Ctrl + D quits the IPython shell. We may want to be able to go back to our experiments. In IPython, it is easy to save a session for later:
In [1]: %logstart Activating auto-logging. Current session state plus future input saved. Filename : ipython_log.py Mode : rotate Output logging : False Raw input log : False Timestamping : False State : active
Let's say we have the vector addition program that we made in the current directory. Run the script as follows:
In [1]: ls README vectorsum.py In [2]: %run -i vectorsum.py 1000
As you probably remember, 1000
specifies the number of elements in a vector. The -d
switch of %run
starts an ipdb
debugger with c
the script is started. n
steps through the code. Typing quit
at the ipdb
prompt exits the debugger:
In [2]: %run -d vectorsum.py 1000 *** Blank or comment *** Blank or comment Breakpoint 1 at: /Users/…/vectorsum.py:3
Tip
Enter c at the ipdb>
prompt to start your script.
><string>(1)<module>() ipdb> c > /Users/…/vectorsum.py(3)<module>() 2 1---> 3 import sys 4 from datetime import datetime ipdb> n > /Users/…/vectorsum.py(4)<module>() 1 3 import sys ----> 4 from datetime import datetime 5 import numpy ipdb> n > /Users/…/vectorsum.py(5)<module>() 4 from datetime import datetime ----> 5 import numpy 6 ipdb> quit
We can also profile our script by passing the -p
option to %run:
In [4]: %run -p vectorsum.py 1000 1058 function calls (1054 primitive calls) in 0.002 CPU seconds Ordered by: internal time ncalls tottime percall cumtime percall filename:lineno(function) 1 0.001 0.001 0.001 0.001 vectorsum.py:28(pythonsum) 1 0.001 0.001 0.002 0.002 {execfile} 1000 0.000 0.0000.0000.000 {method 'append' of 'list' objects} 1 0.000 0.000 0.002 0.002 vectorsum.py:3(<module>) 1 0.000 0.0000.0000.000 vectorsum.py:21(numpysum) 3 0.000 0.0000.0000.000 {range} 1 0.000 0.0000.0000.000 arrayprint.py:175(_array2string) 3/1 0.000 0.0000.0000.000 arrayprint.py:246(array2string) 2 0.000 0.0000.0000.000 {method 'reduce' of 'numpy.ufunc' objects} 4 0.000 0.0000.0000.000 {built-in method now} 2 0.000 0.0000.0000.000 arrayprint.py:486(_formatInteger) 2 0.000 0.0000.0000.000 {numpy.core.multiarray.arange} 1 0.000 0.0000.0000.000 arrayprint.py:320(_formatArray) 3/1 0.000 0.0000.0000.000 numeric.py:1390(array_str) 1 0.000 0.0000.0000.000 numeric.py:216(asarray) 2 0.000 0.0000.0000.000 arrayprint.py:312(_extendLine) 1 0.000 0.0000.0000.000 fromnumeric.py:1043(ravel) 2 0.000 0.0000.0000.000 arrayprint.py:208(<lambda>) 1 0.000 0.000 0.002 0.002<string>:1(<module>) 11 0.000 0.0000.0000.000 {len} 2 0.000 0.0000.0000.000 {isinstance} 1 0.000 0.0000.0000.000 {reduce} 1 0.000 0.0000.0000.000 {method 'ravel' of 'numpy.ndarray' objects} 4 0.000 0.0000.0000.000 {method 'rstrip' of 'str' objects} 3 0.000 0.0000.0000.000 {issubclass} 2 0.000 0.0000.0000.000 {method 'item' of 'numpy.ndarray' objects} 1 0.000 0.0000.0000.000 {max} 1 0.000 0.0000.0000.000 {method 'disable' of '_lsprof.Profiler' objects}
This gives us a bit more insight in to the workings of our program. In addition, we can now identify performance bottlenecks. The %hist
command shows the commands history:
In [2]: a=2+2 In [3]: a Out[3]: 4 In [4]: %hist 1: _ip.magic("hist ") 2: a=2+2 3: a
I hope you agree that IPython is a really useful tool!