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)]
28.1 μs ± 223 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)
30.3 μs ± 184 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.
[5]:
%%ruby
puts "Ruby #{RUBY_VERSION}"
Ruby 3.3.5
[6]:
%%bash
echo "$BASH"
/opt/homebrew/bin/bash
Ihr könnt stdout und err aus diesen Unterprozessen in Python-Variablen erfassen:
[7]:
%%bash --out output --err error
echo "stdout"
echo "stderr" >&2
[8]:
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:
[9]:
%timeit?
Docstring:
Time execution of a Python statement or expression
**Usage, in line mode:**
%timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] statement
**or in cell mode:**
%%timeit [-n<N> -r<R> [-t|-c] -q -p<P> -o] setup_code
…
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:
[10]:
%magic
IPython's 'magic' functions
===========================
The magic function system provides a series of functions which allow you to
control the behavior of IPython itself, plus a lot of system-type
features. There are two kinds of magics, line-oriented and cell-oriented.
Line magics are prefixed with the % character and work much like OS
command-line calls: they get as an argument the rest of the line, where
arguments are passed without parentheses or quotes. For example, this will
time the given statement::
%timeit range(1000)
Cell magics are prefixed with a double %%, and they are functions that get as
an argument not only the rest of the line, but also the lines below it in a
separate argument. These magics are called with two arguments: the rest of the
call line and the body of the cell, consisting of the lines below the first.
For example::
%%timeit x = numpy.random.randn((100, 100))
numpy.linalg.svd(x)
will time the execution of the numpy svd routine, running the assignment of x
as part of the setup phase, which is not timed.
…
Um schnell eine Liste aller verfügbaren magic-Funktionen zu erhalten, gebt Folgendes ein:
[11]:
%lsmagic
[11]:
Available line magics:
%alias %alias_magic %autoawait %autocall %automagic %autosave %bookmark %cat %cd %clear %code_wrap %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 %mamba %man %matplotlib %micromamba %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 %uv %who %who_ls %whos %xdel %xmode
Available cell magics:
%%! %%HTML %%SVG %%bash %%capture %%code_wrap %%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.