後輩が数値計算を使う、簡単なバッチ処理をPythonで書き始めました。
一応私もPythonの知識ならそれなりにあるのでいろいろ教えられることは(まだ)あります。 そのための予行練習としていろいろまとめておきます。
正直、自分よりもっと数値計算やプログラミングに関する知識と経験豊富なエンジニアがいれば、 彼ももっといろいろなことができるようになっているんじゃないかと思ってしまい、申し訳なさを感じています。
Pythonの言語のイディオムを覚えよう
まずは、道具であるプログラミング言語を使いこなせるようになりましょう。 おすすめは『Pythonチュートリアル第3版』です。
- 作者: Guido van Rossum,鴨澤眞夫
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/03/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
WEBでも内容が公開されています。
Python チュートリアル — Python 3.5.2 ドキュメント
内容は割と被りますが、『Dive into Python3』も素晴らしい資料です。こちらのほうが若干内容が高度です。
numpyのベクトル演算を使いこなそう
既にRのベクトル演算を使いこなしているので基本的には問題ないと思いますが、
一部のコードでpandas
のデータフレームをイテレーターとして回していたり、
もっと効率の良い&読みやすいコードが書けるんじゃないかと思っています。
(レビューする際、ロジックの細かいところまで見れていなくてゴメンナサイ…)
Pythonの数値計算ライブラリ NumPy入門 « Rest Term
関数型言語をひとつ勉強して、map
とfilter
とreduce
が使いこなせるようになれば、
ベクトルや行列演算も自然に使いこなせるようになるでしょう…が、けっこう負担が大きいかも…。
パッケージ化しよう
Rの記事ですが、パッケージ化するメリットはこちらの記事にまとめられています。
Rのコードをパッケージの形で管理すると、次のような利点があります。
- 他の人へのコードの共有が簡単になる(コマンド1つでインストールされる!)
- 実行結果が、環境に依存せず再現する(reproducible)ことが担保しやすくなる
- 規約に従うことで、本質的な実装に集中しやすくなる
Rのパッケージは上記 1, 2 の利点を実現するために、「テンプレートやさまざまな規約(convention)」を採用しています。一見きゅうくつに思えるかもしれませんが、こうした実装上の決め事に従うことにより、開発者はファイルの適切な配置に迷う必要がなくなり、本質的な処理の実装に集中しやすくなるのです。
ところが、歴史的な経緯(?)によって標準的なパッケージ管理・開発の方法のやり方の方法の情報が錯綜していて、正直自分にもどういうやり方がいいのかよくわからないです。
(完全に余談ですが、最近Elixirで遊んでいて、hex new xxx
というコマンドでプロジェクトの標準的なディレクトリ構成が作られ、そのままスムーズにパッケージ開発できることを知って驚きました。Pythonでもこういう仕組みが欲しいですね。)
ひとまず、以前WACODE(わこうど)夏期講習のチュートリアルで使われていたリポジトリを参考にすると良いでしょう。
単体テストとSphinxドキュメントを書こう
パッケージ化する中で、単体テストとドキュメントを書いておくと、運用や引き継ぎが楽になると思います。 また、これらはWEB APIやバッチ処理を書く際にも使えます。
Pythonには標準で添付されているunittest
ライブラリで単体テストが書けます。
テストにもいろいろなレイヤーがあるので、「機械学習のロジックの精度の検証までできるの?」と思うかもしれませんが、それは無理です。 交差検定とか、実データ流してテストするとか、そっちの知見が必要です。
unittest
はすごく雑にいうと、値のif
文での条件の網羅のし忘れ等のポカミスを防げます。
また、「どんな入力が想定されているのか」という仕様書のような役割もしてくれます。
もちろん、人が書くものなので、どんな入力データ(例えば境界値)を入れればいいかといった、基本的なソフトウェアテストの知識は必要です。
- 作者: 高橋寿一
- 出版社/メーカー: 翔泳社
- 発売日: 2013/12/10
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (7件) を見る
「そんなのJupyter notebookで試しているから大丈夫だよ」と思うかもしれませんが、だんだんコードが大きくなるに従ってつらくなるはずです。 また、今後運用していく中で、言語やライブラリのバージョンを上げた際に、異常を見つけるのにも役立ちます。
また、ドキュメント生成にはSphinx
というツールを使うのが一般的です。
実行速度の早い言語も習得しよう
なんとなく感じていると思いますが、Pythonはそれほど早い言語ではありません。
コアの計算ロジック部分だけCやC++で書くという選択肢もあると思います。今からやるならJuliaもいいかもしれません。
…が、このあたりは私の経験不足のせいでアドバイスできるほどの知識は持っていません。
開発側の知識も持っておこう
もはやPython関係ないですが、今作っているような最適化のアルゴリズムを、 巨大なサービスに埋め込むのは大変な苦労がかかることは想像できると思います。
そんなとき、簡単にWeb APIや小さいプログラムに分けて、簡単に差し替えできるように作るべきです。 また、おそらく分析結果のロジックを、簡単にデプロイできるようなサービスやソフトウェアも増えてくると思います。 (既にいいものがあるかもしれません。) 「マイクロサービス」とか「サーバーレス」とかその辺のワードのニュースを追っておくと良いかもしれません。
そういうものが出てきた際に困らないように、ニュースを追っておきましょう。 多分、フロントエンドより、バックエンドやミドルウェアの知識が必要になると思います。
全て自分ひとりでできるようになる必要はないと思います。どちらかというと開発者側とのコミュニケーションのために知っておいたほうがいいです。