Jupyter/IPythonで%time
や%timeit
で実行時間を計測できるのはよく知られていると思いますが、これを加工したり可視化したいと思ったことはないでしょうか?
%%capture
を使うと、標準出力をPythonのオブジェクトとして扱えます。
実際にやってみましょう。
%%capture result
%timeit 2 ** 100
%%capture
の引数がオブジェクト名となります、ほかのオプションについてはヘルプを参照してください。
%capture [--no-stderr] [--no-stdout] [--no-display] [output]
run the cell, capturing stdout, stderr, and IPython's rich display() calls.
positional arguments:
output The name of the variable in which to store output. This is a utils.io.CapturedIO
object with stdout/err attributes for the text of the captured output.
CapturedOutput also has a show() method for displaying the output, and __call__ as
well, so you can use that to quickly display the output. If unspecified, captured
output is discarded.
stdout
属性を参照すると、標準出力が文字列に格納されていることがわかります。
print(result.stdout)
292 ns +- 4.24 ns per loop (mean +- std. dev. of 7 runs, 1000000 loops each)
この292 ns
の部分を数値として扱えるように秒に変換してみます。
value, unit = result.stdout.split()[:2]
float(value) * {"s": 1, "ms": 1e-3, "us": 1e-6, "ns": 1e-9}[unit]
2.92e-07
%timeit
に限らず、%%capture
を使うとさまざまな出力をJupyter上から加工できます。よいJupyterライフを!