================================== はじめに ================================== なぜ Python なのか ? ====================== `Python` を使う理由ですが,一番大きい理由は, 研究活動とかでデータを処理するのに便利だから(だと個人的に思っている)からです. 研究活動で必要となるスキルをちょっと列挙して考えてみましょう. * データを得ること: これはシミュレーションや, 実験結果です. * データを操作したり統計処理する: 測定には誤差はつきものなので何回もいろんなケースで試すことも必要です. * 結果を可視化する: 自分が何をやっているか,どんな実験結果がでたのかを理解したり他人に説明するために必要です. * 結果を伝えるため: 卒論や修論,研究発表のために効果的な図を作る このようなデータを取り扱うためのスキルは一般に計算機を通して行われます. であれば,今までの `C`, `Java` などの言語とか, `Excel` でいいやん という声も聞こえてきそうですが,それぞれの言語には *適材適所* があります. .. index:: コンパイラ言語 .. index:: C/C++ .. index:: Java .. index:: Fortran `C/C++`, `Java`, `Fortran` などの **コンパイラ言語** の特性を考えてみます. * コンパイラ言語の使用上の利点: * ( **うまく書けば** ) とても速い実行コードを生成することが *可能*. 非常に最適化されたライブラリは,このような言語のために書かれている. 例: BLAS_ (ベクトル, 行列演算), FFTW_ (フーリエ変換) .. _BLAS: https://ja.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms .. _FFTW: http://www.fftw.org/ * コンパイラ言語の使用上の欠点: * ユーザーに一定の技量を要求する.特に C言語系のメモリ管理などは (初級者にとっては) 記述的に意味不明なことが多い. * コンパイル作業が必要なので,書きかけのコード断片をテストしたり, 試しながらの開発は基本的にできない 言うなれば,これらの言語は **玄人向け** の道具です. 速度が必要とされる計算部を,これらの言語で実現するケースは意味がありますが, あまり本質ではないユーザーインターフェースやデータの可視化の 部分までこれらの言語で記述してデバッグの時間を使うのは時間の面で少々勿体無い気がします. (ユーザーインターフェースや可視化の部分を研究するとか,それが好きというのならともかく) .. index:: スクリプト言語 .. index:: MATLAB .. index:: R .. index:: Ruby .. index:: Perl .. index:: Python 一方,ここで取り扱う `Python` は **スクリプト言語** と呼ばれる分類に属します.これはコンパイラ型言語の欠点を補うような形式になっています. スクリプト言語は Light Weight Language (軽量言語)と呼ばれ, `Ruby`, `Perl`, `MATLAB`, `R` などの言語がこれにあたります. * スクリプト言語の使用上の利点: * メモリ管理などの計算機管理から,ユーザを開放 * 豊富なライブラリによる機能の提供 * **対話的な開発** : とりあえずお手軽にコマンドを試せる (インターフェースとして適切) * スクリプト言語の使用上の欠点: * とろい(ライブラリを使わずに書くと,主に実行速度の面で) ただし,欠点の部分は,計算の最も良く使用される部分を `C` 言語などのコンパイラ言語で書いてしまえば それほどのデメリットは存在しません.むしろ,計算コアの部分をスクリプト言語で包み込んで処理するといった 使い方の方が人に優しい(と考えられているよう)です. さらにこれらの言語は用途に応じて特化した部分があります. 例えば,電通大では,研究室配属になれば `MATLAB` は格安の価格で使用できるようになります. * `MATLAB` は,行列演算や線形代数に特化したライブラリを内包し,数多くの科学技術計算をカバーできるように設計されています. * `R` 言語は,統計解析に用いられる言語ですが,こちらは統計計算をより使いやすいように設計されています. * `Python`, `Ruby`, (`Perl`) は,オブジェクト指向的な方向性を取り入れた言語で,テキスト処理や Web プログラミングなどの用途に用いられていますが,簡易なお試し的な言語として用いることもできます. `Python` の特徴 ============================================ `Python` の歴史は古く, 1990 年代の初めから開発が開始され現在でも開発が続けられています. Python の言語設計は, **「シンプル」** で **「習得が容易」** という目標に重点が置かれています. 多くのスクリプト系言語ではユーザの目先の利便性を優先して色々な機能を言語要素とし取り入れてしまう場合が多いのですが, Python ではそういった小細工が追加されることはあまりありません. 言語自体の機能は最小限に押さえ,必要な機能は 拡張 **モジュール** と呼ばれる 言語ライブラリとして追加する、というのが `Python` のポリシーです. ただし, `Python` はシンプルがとりえの初心者用プログラミング言語, という訳ではありません.(僕は研究をスクリプト言語の上で主に行っていますので) より高度なプログラミング上のテクノロジーや, 大規模開発をサポートするための機能を提供してくれています. 特にAI関連の機械学習,深層学習と言った分野では高度なライブラリ群(パッケージ)が提供されるため, 簡易な書き方でいろんなことが出来るという点も近年では注目されている理由だったりします. ただし,メモリとCPUを使い込むのでエッジ向けデバイスという用途としては向いていないとの 観点もあったりします. Python の主な特徴を以下にあげます: * オープンソース(商用利用も含め、無償で利用・再配布可) * マルチプラットフォーム(Unix, Windows, Macintosh, etc...) * インタープリタ * オブジェクト指向言語 * モジュール機構 * リストや辞書、複素数など、豊富な組み込みデータ型 * 例外処理 * クラスや関数などもオブジェクトとして扱うことができる * マルチスレッド対応(ここらへんは,アレだけど) * 豊富な拡張ライブラリ * `C/C++` による拡張が簡単 * `C/C++` アプリケーションへの組み込みが(比較的)簡単 科学技術計算と `Python` ============================================ 古典的な数値計算手法や基本的な動作などのアルゴリズムに関しては, 計算機科学の黎明期からの積み重ねてきた道具(計算機ツール)が豊富に存在します. 例えば,"データ点を説明する曲線を推定すること(回帰問題)", "Fourier 変換","固有値解析","最大値探索(最適化)", "フィルタリング" などといったアルゴリズム(道具)に関しては 既に洗練された手法が確立されています. デバッグまでの開発サイクルを考えた場合,これらの道具そのものが研究対象で無い限り **自分で** コードを書くことは,したくないことです. すでに誰かが作成し,多くの人に評価されているコードは,既に信頼性が高い道具として 扱うことができます. また,このようなコードを道具として再利用してこそのソフトウェアです. これは *車輪の再発明はしない* という格言として言い表されています. 数値計算などの科学技術計算そのものを研究対象としていなければ, 計算アルゴリズムを構成する部品の記述をすることは, 本質的な仕事ではないですし, 時間資源をそこにつぎ込むには人生は短すぎます. プログラミングでは,うまくサボることはわりと重要です. 単に "曲線を描きたい", "信号を平滑にしたい", "Fourier 変換を行いたい.","機械学習させたい" といった コモディティ化した道具に関しては,できるだけ,その道のプロが書いたものを使いたいというのも 研究者としての本音です. 共同研究者や学生, 顧客と簡単に意思伝達ができ, コードが研究室や企業の中で機能するには, コードは本のように読めるものである方が望ましいです. だから, プログラミング言語の構文の中の記号は少数であるべきだし, コードを読む読者の理解を数学的, 科学的なものから注意力をそらすような コードも少なくすべきです. `C` 言語などのコンパイラ言語で書かれたコードはこの意味で超えなければならない 壁が存在するのです. ただ,勘違いをしないでほしいことは,アルゴリズムを **理解する手段としてコードを書くこと** は, 非常に重要です.車輪の再発明をしないことは意味があることですが, 車輪がなぜまわるのかを知らないと,他人の作った道具をうまく使えなかったり, 提供されたライブラリのインタフェースを理解できません. その理解を行うために,たとえ稚拙でも原理的なコードを書くことは無駄にはなりません. そういった意味でコードを書く練習は常に必要です. 他人の書いたコードを例題を用いて入出力が正しいかどうかをチェックしたり, コードの動作原理を知ることは,道具として使いこなすために重要なステップです. 原理を抑えた上で,既に開発された車輪を道具として使っていきましょう. `Python` は,科学技術計算をサポートするために,豊富な数学ライブラリを 提供してくれています. この実験で用いる `Scipy`, `Numpy` と呼ばれる行列計算を メインとしたライブラリは, 巨大なデータに対する,統計計算や,信号処理,画像処理のアルゴリズムを簡易な 形で使用できるように提供してくれています. .. index:: Numpy .. index:: Scipy