読者です 読者をやめる 読者になる 読者になる

歩いたら休め

If the implementation is easy to explain, it may be a good idea.

【Python】データサイエンティストのためのPython開発記事紹介

後輩が数値計算を使う、簡単なバッチ処理Pythonで書き始めました。

一応私もPythonの知識ならそれなりにあるのでいろいろ教えられることは(まだ)あります。 そのための予行練習としていろいろまとめておきます。

正直、自分よりもっと数値計算やプログラミングに関する知識と経験豊富なエンジニアがいれば、 彼ももっといろいろなことができるようになっているんじゃないかと思ってしまい、申し訳なさを感じています。

Pythonの言語のイディオムを覚えよう

まずは、道具であるプログラミング言語を使いこなせるようになりましょう。 おすすめは『Pythonチュートリアル第3版』です。

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

WEBでも内容が公開されています。

Python チュートリアル — Python 3.5.2 ドキュメント

内容は割と被りますが、『Dive into Python3』も素晴らしい資料です。こちらのほうが若干内容が高度です。

Dive Into Python 3 日本語版

numpyのベクトル演算を使いこなそう

既にRのベクトル演算を使いこなしているので基本的には問題ないと思いますが、 一部のコードでpandasのデータフレームをイテレーターとして回していたり、 もっと効率の良い&読みやすいコードが書けるんじゃないかと思っています。

(レビューする際、ロジックの細かいところまで見れていなくてゴメンナサイ…)

Pythonの数値計算ライブラリ NumPy入門 « Rest Term

関数型言語をひとつ勉強して、mapfilterreduceが使いこなせるようになれば、 ベクトルや行列演算も自然に使いこなせるようになるでしょう…が、けっこう負担が大きいかも…。

パッケージ化しよう

Rの記事ですが、パッケージ化するメリットはこちらの記事にまとめられています。

Rのコードをパッケージの形で管理すると、次のような利点があります。

  1. 他の人へのコードの共有が簡単になる(コマンド1つでインストールされる!)
  2. 実行結果が、環境に依存せず再現する(reproducible)ことが担保しやすくなる
  3. 規約に従うことで、本質的な実装に集中しやすくなる

Rのパッケージは上記 1, 2 の利点を実現するために、「テンプレートやさまざまな規約(convention)」を採用しています。一見きゅうくつに思えるかもしれませんが、こうした実装上の決め事に従うことにより、開発者はファイルの適切な配置に迷う必要がなくなり、本質的な処理の実装に集中しやすくなるのです。

ところが、歴史的な経緯(?)によって標準的なパッケージ管理・開発の方法のやり方の方法の情報が錯綜していて、正直自分にもどういうやり方がいいのかよくわからないです。

(完全に余談ですが、最近Elixirで遊んでいて、hex new xxxというコマンドでプロジェクトの標準的なディレクトリ構成が作られ、そのままスムーズにパッケージ開発できることを知って驚きました。Pythonでもこういう仕組みが欲しいですね。)

ひとまず、以前WACODE(わこうど)夏期講習チュートリアルで使われていたリポジトリを参考にすると良いでしょう。

github.com

qiita.com

単体テストSphinxドキュメントを書こう

パッケージ化する中で、単体テストとドキュメントを書いておくと、運用や引き継ぎが楽になると思います。 また、これらはWEB APIバッチ処理を書く際にも使えます。

Pythonには標準で添付されているunittestライブラリで単体テストが書けます。

adtech-blog.united.jp

テストにもいろいろなレイヤーがあるので、「機械学習のロジックの精度の検証までできるの?」と思うかもしれませんが、それは無理です。 交差検定とか、実データ流してテストするとか、そっちの知見が必要です。

unittestはすごく雑にいうと、値のif文での条件の網羅のし忘れ等のポカミスを防げます。 また、「どんな入力が想定されているのか」という仕様書のような役割もしてくれます。

もちろん、人が書くものなので、どんな入力データ(例えば境界値)を入れればいいかといった、基本的なソフトウェアテストの知識は必要です。

知識ゼロから学ぶソフトウェアテスト 【改訂版】

知識ゼロから学ぶソフトウェアテスト 【改訂版】

「そんなのJupyter notebookで試しているから大丈夫だよ」と思うかもしれませんが、だんだんコードが大きくなるに従ってつらくなるはずです。 また、今後運用していく中で、言語やライブラリのバージョンを上げた際に、異常を見つけるのにも役立ちます。

また、ドキュメント生成にはSphinxというツールを使うのが一般的です。

qiita.com

sphinx-users.jp

実行速度の早い言語も習得しよう

なんとなく感じていると思いますが、Pythonはそれほど早い言語ではありません。

コアの計算ロジック部分だけCやC++で書くという選択肢もあると思います。今からやるならJuliaもいいかもしれません。

…が、このあたりは私の経験不足のせいでアドバイスできるほどの知識は持っていません。

開発側の知識も持っておこう

もはやPython関係ないですが、今作っているような最適化のアルゴリズムを、 巨大なサービスに埋め込むのは大変な苦労がかかることは想像できると思います。

そんなとき、簡単にWeb APIや小さいプログラムに分けて、簡単に差し替えできるように作るべきです。 また、おそらく分析結果のロジックを、簡単にデプロイできるようなサービスやソフトウェアも増えてくると思います。 (既にいいものがあるかもしれません。) 「マイクロサービス」とか「サーバーレス」とかその辺のワードのニュースを追っておくと良いかもしれません。

そういうものが出てきた際に困らないように、ニュースを追っておきましょう。 多分、フロントエンドより、バックエンドやミドルウェアの知識が必要になると思います。

全て自分ひとりでできるようになる必要はないと思います。どちらかというと開発者側とのコミュニケーションのために知っておいたほうがいいです。