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 werden

  • cell 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)]
27.4 µs ± 186 ns per loop (mean ± std. dev. of 7 runs, 10,000 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)
29.9 µs ± 170 ns per loop (mean ± std. dev. of 7 runs, 10,000 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.11.4 (main, Jun 20 2023, 17:23:00) [Clang 14.0.3 (clang-1403.0.22.14.1)]
[3]:
%%ruby
puts "Ruby #{RUBY_VERSION}"
Ruby 2.6.10
[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:

[7]:
%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:

[8]:
%magic

Um schnell eine Liste aller verfügbaren magic-Funktionen zu erhalten, gebt Folgendes ein:

[9]:
%lsmagic
[9]:
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.