IPython-Magie#
IPython ermöglicht nicht nur Python interaktiv zu verwenden, sondern erweitert auch die Python-Syntax um sog. Magic Commands, die mit dem Präfix %
versehen werden. Sie wurden entwickelt, um häufig auftretende Probleme bei der Datenanalyse schnell und einfach lösen zu können. Dabei wird zwischen zwei verschiedenen Arten von Magic Commands unterschieden:
line magics, die durch einen einzelnen
%
-Präfix gekennzeichnet sind und auf einer einzelnen Eingabezeile ausgeführt werdencell magics, denen ein doppeltes Symbol
%%
vorangestellt wird und die innerhalb einer Notebook-Zelle ausgeführt werden.
Externen Code ausführen: %run
#
Wenn ihr anfangt, umfangreicheren Code zu entwickeln, arbeitet ihr vermutlich sowohl in IPython für interaktive Erkundungen als auch in einem Texteditor zum Speichern von Code, den ihr wiederverwenden möchtet. Mit der %run
-Magie könnt ihr diesen Code direkt in eurer IPython-Sitzung ausführen.
Stellt euch vor, ihr hättet eine myscript.py
-Datei mit folgendem Inhalt erstellt:
def square(x):
return x ** 2
for N in range(1, 4):
print(N, "squared is", square(N))
[1]:
%run myscript.py
1 squared is 1
2 squared is 4
3 squared is 9
Beachtet, dass nach dem Ausführen dieses Skripts alle darin definierten Funktionen für die Verwendung in eurer IPython-Sitzung verfügbar sind:
[2]:
square(4)
[2]:
16
Es gibt verschiedene Möglichkeiten, die Ausführung eures Codes zu verbessern. Wie üblich, könnt ihr euch die Dokumentation in IPython anzeigen lassen mit %run?
.
Timing-Code ausführen: %timeit
#
Ein weiteres Beispiel für eine Magic-Funktion ist %timeit
, die automatisch die Ausführungszeit der darauf folgenden einzeiligen Python-Anweisung ermittelt. So können wir uns z.B. die Performance einer list comprehension ausgeben lassen mit:
[3]:
%timeit L = [n ** 2 for n in range(1000)]
3.17 ms ± 800 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Der Vorteil von %timeit
ist, dass bei kurzen Befehlen automatisch mehrere Läufe ausgeführt werden, um robustere Ergebnisse zu erzielen. Bei mehrzeiligen Anweisungen wird durch Hinzufügen eines zweiten %
-Zeichens eine Zellenmagie erzeugt, die mehrere Eingabezeilen verarbeiten kann. Hier ist zum Beispiel die äquivalente Konstruktion mit einer for
-Schleife:
[4]:
%%timeit
L = []
for n in range(1000):
L.append(n ** 2)
3.31 ms ± 855 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Wir können sofort erkennen, dass die list comprehension etwa 10% schneller ist als das entsprechende Äquivalent mit einer for
Schleife. Ausführlicher beschreiben wir Performance-Messungen und -Optimierungen dann in Profiling.
Code anderer Interpreter ausführen#
IPython verfügt über eine %%script
-Magie, mit der ihr eine Zelle in einem Unterprozess eines Interpreters auf eurem System ausführen könnt, z.B. bash
, ruby
, perl
, zsh
, R
usw. Dies kann auch ein eigenes Skript sein, das Eingaben in stdin
erwartet. Hierzu wird einfach eine Pfadangabe oder ein Shell-Befehl an das Programm übergeben, das in der %%script
-Zeile angegeben ist. Der Rest der Zelle wird von diesem Skript ausgeführt, stdout
oder err
aus dem
Unterprozess erfasst und angezeigt.
[1]:
%%script python2
import sys
print 'Python %s' % sys.version
Python 2.7.15 (default, Oct 22 2018, 19:33:46)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
[2]:
%%script python3
import sys
print('Python: %s' % sys.version)
Python: 3.7.0 (default, Aug 22 2018, 15:22:29)
[Clang 8.0.0 (clang-800.0.42.1)]
[3]:
%%ruby
puts "Ruby #{RUBY_VERSION}"
Ruby 2.3.7
[4]:
%%bash
echo "$BASH"
/bin/bash
Ihr könnt stdout
und err
aus diesen Unterprozessen in Python-Variablen erfassen:
[5]:
%%bash --out output --err error
echo "stdout"
echo "stderr" >&2
[6]:
print(error)
print(output)
stderr
stdout
Standard-script
-Magie konfigurieren#
Die Liste der Aliase für die script
-Magie ist konfigurierbar. Standardmäßig können ggf. einige gängige Interpreter verwendet werden. Ihr könnt jedoch in ipython_config.py
auch eigene Interpreter angeben:
c.ScriptMagics.scripts = ['R', 'pypy', 'myprogram']
c.ScriptMagics.script_paths = {'myprogram': '/path/to/myprogram'}
Hilfe-Funktionen: ?
, %magic
und %lsmagic
#
Wie normale Python-Funktionen verfügen auch die magischen IPython-Funktionen über docstrings, auf die einfach zugegriffen werden können. Um z.B. die Dokumentation der %timeit
-Magie zu lesen, gebt einfach Folgendes ein:
[5]:
%timeit?
Auf die Dokumentation für andere Funktionen kann auf ähnliche Weise zugegriffen werden. Um auf eine allgemeine Beschreibung der verfügbaren %magic
-Funktionen einschließlich einiger Beispiele zuzugreifen, könnt ihr Folgendes eingeben:
[6]:
%magic
Um schnell eine Liste aller verfügbaren magic
-Funktionen zu erhalten, gebt Folgendes ein:
[7]:
%lsmagic
[7]:
Available line magics:
%alias %alias_magic %autoawait %autocall %automagic %autosave %bookmark %cat %cd %clear %colors %conda %config %connect_info %cp %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %killbgscripts %ldir %less %lf %lk %ll %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %lx %macro %magic %man %matplotlib %mkdir %more %mv %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %pip %popd %pprint %precision %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %rm %rmdir %run %save %sc %set_env %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode
Available cell magics:
%%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%js %%latex %%markdown %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile
Automagic is ON, % prefix IS NOT needed for line magics.
Ihr könnt auch einfach eure eigenen magic
-Funktionen definieren. Weitere Informationen hierzu erhaltet ihr unter Defining custom magics.