1.1. ツールやワークフローを使った科学技術計算

著者: Fernando Perez, Emmanuelle Gouillart, Gaël Varoquaux, Valentin Haenel

1.1.1. どうして Python?

1.1.1.1. 科学者が必要とするもの

  • データを取得する(シミュレーション、実験装置の操作)

  • データに手を加え、処理する。

  • 結果を可視化する... (何が起きているのかを理解するために!)

  • 結果を伝える: レポートや学術出版のために図を作成し、プレゼンテーションを書く。

1.1.1.2. 必要なものの列挙

  • 古典的な数値計算手法や基本的な動作などの既存の 積み木 が豊富にある:曲線を描く, Fourier 変換, フィッティングアルゴリズムを再プログラミングしたくない. 車輪の再発明はするな!

  • 学習が容易:計算機科学は科学者の仕事ではないし, 科学者が教育することでもない。ただ, 曲線を描きたい, 信号を平滑にしたい, Fourier 変換を数分で行いたい.

  • 共同研究者や学生, 顧客と簡単に意思伝達ができ, コードが研究室や企業の中で機能する:コードは本のように読めるものでなければいけない. だから, プログラミング言語の構文の中の記号は少数であるべきだし, コードを読む読者の理解を数学的, 科学的なものから反らすようなルーチンも少なくあるべき.

  • 迅速に実行できる効率的なコード...だとしても書くのに多くの時間をかけるものは速くても役に立たない. つまり, 書くことと実行することの両方の速度が必要.

  • できれば, すべてを1つの環境/言語で済ませたい, 新しい問題それぞれを解決するのに新しいソフトウェアを学ぶことは避けたい.

1.1.1.3. 現存する解法

どの解法が科学者にとって役に立つのか?

コンパイラ言語:C, C++, Fortran, 等

  • 利点:

    • とても速い. 最適化したコンパイラ. 強烈に重い計算ではこれらの言語を越える性能を出すのは困難.

    • いくつかの最適化された効率のより科学技術計算ライブラリはこれらの言語のために書かれている. 例:BLAS(ベクトル, 行列演算)

  • 欠点:

    • とても使いにくい: 開発が対話的にできない, コンパイルしなければいけない, 構文が冗長( &, ::, }}, ; 等)手動でのメモリ管理(C では油断ならない). これらの言語は非計算機科学者にとっては 難しい言語.

スクリプト言語: Matlab

  • 利点:

    • 様々な領域に渡った膨大なアルゴリズムが収集された豊富なライブラリがある. これらのライブラリはコンパイラ言語で書かれているので速い.

    • 快適な開発環境: 簡潔で整理されたヘルプ、統合開発環境等。

    • 商用サポートが得られる。

  • 欠点:

    • 言語の基本機能が貧弱で先進的なユーザからすると制限が多く感じられる。

    • フリーでない。

他のスクリプト言語:Scilab, Octave, Igor, R, IDL, 等。

  • 利点:

    • オープンソースでフリー. そうでないものも Matlab より安い.

    • いくつかの機能がとても先進的(R は統計, Igor は図等。)

  • 欠点:

    • Matlab と比較すると利用できるアルゴリズムは少ない, より先進的とはいえない.

    • いくつかのソフトウェアは1つの領域に専念している. 例:Gnuplot や xmgrace は曲線を描く専門. これらのプログラムは強力だが曲線を描くなど1つの使い方に制限されてしまう.

Python はどうなの?

  • 利点:

    • 科学技術計算向けの豊富なライブラリ(でも Matlab よりすこしだけ少ない)

    • よく練られた言語で, 読みやすく構造がはっきりしたコードが書ける:思ったとおりのコードが書ける.

    • 科学技術計算以外の仕事をするライブラリがたくさんある(web サーバ管理, シリアルポートアクセス等)

    • フリーなオープンソースソフトウェアで様々なコミュニティで広く使われている.

  • 欠点:

    • 開発環境は, 例えば Matlab と比べると少し使いにくい (より geek 向け).

    • 専門向けのソフトウェアやツールにあるアルゴリズム全てがあるわけではない.

1.1.2. Pythonで科学技術計算の積み木を組む

Matlab や Scilab あるいは R と違って、Python は科学技術計算のためのあらかじめバンドルされたモジュールが含まれていません。以下の基本的な積み木は科学技術計算環境を入手することで得ることができます。

  • Python, 包括的で現代的なプログラミング言語

    • Python 言語:データ型(string, int), 制御フロー, データの集まり(リスト, 辞書), パターン等

    • 標準ライブラリのモジュール

    • Python で書かれたたくさんの専用モジュールやアプリケーション:web プロトコル, web フレームワーク等, もちろん科学技術計算も

    • 開発ツール(自動化されたテスト, ドキュメント生成)

    ../_images/snapshot_ipython.png
  • IPython, 先進的な Python shell http://ipython.org/

  • Numpy: 強力な 数値配列 オブジェクトとそれらを操作する強力なルーチンを提供 http://www.numpy.org/

1.1.3. 対話的なワークフロー: IPython とテキストエディタ

対話的な確認とアルゴリズムの理解: この節では、調べたりアルゴリズムを理解するのに手軽に使える IPython での対話的なワークフローについて述べます。

Python は汎用的な目的に利用できる言語です。特定の一つの恵まれた環境で動作するわけでもなく、それを利用するやり方がただ一つなわけでもありません。そのことが初心者にとっては適切なやり方がわかりづらくしているかもしれませんが、それによって web サーバや組込み機器でプログラムを書くのに Python を利用することも可能にしています。

この節の参考ドキュメント:

IPython user manual: http://ipython.org/ipython-doc/dev/index.html

1.1.3.1. コマンドラインでの対話操作

ipython を起動:

In [1]: print('Hello world')
Hello world

オブジェクトの後ろに ? 演算子を利用してヘルプを取得します:

In [2]: print?
Type: builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form: <built-in function print>
Namespace: Python builtin
Docstring:
print(value, ..., sep=' ', end='\n', file=sys.stdout)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.

1.1.3.2. エディタによってアルゴリズムを練り上げる

テキストエディタで my_file.py というファイルを作成します。EPD (Enthought Python Distribution) では Scite を利用することができ、スタートメニューから利用できます。Python(x,y) では Spyder を利用することができます。Ubuntu ではお気に入りのエディタが無い場合は Stani’s Python editor をインストールすることをおすすめします。ファイルに以下の行を追加します:

s = 'Hello world'
print(s)

これで IPython を動かして結果の変数を探ることができます:

In [1]: %run my_file.py
Hello world
In [2]: s
Out[2]: 'Hello world'
In [3]: %whos
Variable Type Data/Info
----------------------------
s str Hello world

スカラー関数の根を求める

スクリプトのみを利用して動かしたいという欲求にかられがちですが、スクリプトは単純に指示された命令を続けていくだけのファイルです、スクリプトを関数の集まりに徐々に変えていくことを検討しましょう。

  • スクリプトは再利用可能ではありませんが、関数は再利用可能です。

  • 関数の考え方は問題を小さなかたまりに分割する助けになります。

1.1.3.3. IPython の Tips と Tricks

IPython user manual には IPython を利用法についての豊富な情報が含まれていますが、始めたばかりなので手短な入門として3つの便利な機能を紹介します: 履歴, magic functions, aliases そして tab 補完

UNIX シェルのように、IPython はコマンド履歴をサポートしています。updown キーを打つと、過去に打ったコマンドを閲覧することができます。

In [1]: x = 10
In [2]: <UP>
In [2]: x = 10

IPython は マジック 関数と呼ばれる、頭に % 文字がつくコマンドをサポートしています。例としては runwhos 関数がこれまでの節で表われていました、これらはマジック関数です。デフォルトで有効になる automagic 設定によって関数の前の ``%``記号を除くことができます。そうすることで、マジック関数を打ち込むだけで動作するようになります。

他の便利なマジック関数は:

  • %cd は現在いるディレクトリを変更します。

    In [2]: cd /tmp
    
    /tmp
  • %timeit は標準ライブラリの timeit モジュールを利用して、短いコードの断片を実行して時間を測定することができます。

    In [3]: timeit x = 10
    
    10000000 loops, best of 3: 39 ns per loop
  • %cpaste はコードのペーストができます、特に web サイトからの、標準的なPython プロンプト(例 >>>) や ipython のプロンプト (例 in [3]) が文の頭についているコードをペーストできます。

    In [5]: cpaste
    
    Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
    :In [3]: timeit x = 10
    :--
    10000000 loops, best of 3: 85.9 ns per loop
    In [6]: cpaste
    Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
    :>>> timeit x = 10
    :--
    10000000 loops, best of 3: 86 ns per loop
  • %debug はポストモダンデバッグの入口となるでしょう。いってみれば、実行して例外が上がった場合に %debug を利用するとデバッガは例外が投げられた箇所に向かいます。

    In [7]: x === 10
    
    File "<ipython-input-6-12fd421b5f28>", line 1
    x === 10
    ^
    SyntaxError: invalid syntax
    In [8]: debug
    > /.../IPython/core/compilerop.py (87)ast_parse()
    86 and are passed to the built-in compile function."""
    ---> 87 return compile(source, filename, symbol, self.flags | PyCF_ONLY_AST, 1)
    88
    ipdb>locals()
    {'source': u'x === 10\n', 'symbol': 'exec', 'self':
    <IPython.core.compilerop.CachingCompiler instance at 0x2ad8ef0>,
    'filename': '<ipython-input-6-12fd421b5f28>'}

IPython のヘルプ

  • %quickref マジック関数を介して、ビルトインの IPython チートシートに アクセスできます。

  • 利用可能なマジック関数の一覧は %magic と打つことで見ることができます。

さらに IPython は多様な エイリアス を搭載していて、UNIX に共通するコマンドラインツールを模倣します、例えば ls でファイルの一覧を得たり、cp でファイルをコピー、rm でファイルを削除等。エイリアスの一覧は alias と打つことで見ることができます。

In [1]: alias
Total number of aliases: 16
Out[1]:
[('cat', 'cat'),
('clear', 'clear'),
('cp', 'cp -i'),
('ldir', 'ls -F -o --color %l | grep /$'),
('less', 'less'),
('lf', 'ls -F -o --color %l | grep ^-'),
('lk', 'ls -F -o --color %l | grep ^l'),
('ll', 'ls -F -o --color'),
('ls', 'ls -F --color'),
('lx', 'ls -F -o --color %l | grep ^-..x'),
('man', 'man'),
('mkdir', 'mkdir'),
('more', 'more'),
('mv', 'mv -i'),
('rm', 'rm -i'),
('rmdir', 'rmdir')]

最後に tab 補完 機能についても述べておきたいと思います。この説明は IPython manual から直接引用します。

*Tab 補完は特に、扱おうとしているオブジェクトの構造を調べたりするのに便利です、特に属性を調べるときに便利です。単に object_name.<TAB> と打つとオブジェクトの属性を閲覧できます。Python オブジェクトやキーワードはもちろんのこと、ファイルやディレクトリ名でも tab 補完は動作します。

In [1]: x = 10
In [2]: x.<TAB>
x.bit_length x.conjugate x.denominator x.imag x.numerator
x.real
In [3]: x.real.
x.real.bit_length x.real.denominator x.real.numerator
x.real.conjugate x.real.imag x.real.real
In [4]: x.real.