人工知能企業のエンジニアの開発記録

人工知能企業のエンジニアの模索の記録です。pythonを基とした開発や、スキルアップのためのライフハックおよびそれらへの挑戦を書き連ねます。

自分が使っているPython開発環境を晒す(1.開発環境編)

記念すべき第一記事はpythonの開発に関して書くことにしました。 個人でpythonを書くという話はよく聞きますが、開発の業務でpythonを使うという例はまだまだ少ないようです。 統計分析や機械学習をする、機械学習モデルを組み込む必要があるからという限りで実用されている話は聞きますが、 例えばweb開発(pythonでもできる)なんかはやはりrubyphpが優勢でメジャーとなっていますね。

一方でAIブームに火がついてからは、pythonを中心に深層学習ライブラリが作られ、機械学習をしたい(もしくはしている) というケースも増えました。特に機械学習を導入する場合には、やはりpythonで開発ができた方が有利だと思っています。

ということでpythonを業務で使いたい人やpythonOSSにコミットしたい人もいるんじゃないかなーと思い この記事を書くことにしました。AIスタートアップに勤めている身なので、pythonで開発していますので、そのノウハウを公開します。

あまり入門者向けではないですが、pythonでの開発においては基本となるものを紹介します。 pythonを始めたばかりで、pythonではどうやって開発するの?と疑問に思っている人向けに書きました。 また、本記事でおまけとして勉強方法を載せましたので、入門者はまずそちらに目を通すと良いと思います。

本記事は開発環境編、web開発編、データサイエンス編の3編構成で公開する予定です。

目次

バージョン管理 - pyenv virtualenv

Macの場合は最初からpythonが入っていますが、古いバージョン(python2)なので非推奨です。 また、プロジェクトごとにpythonのバージョンと使うライブラリを設定できる pyenv-virtualenvというバージョン管理ツールがあるのでそれを使うのをお勧めします。

OSXならばHomebrewでインストールできますし、それ以外でもgit cloneですぐに導入できます。 詳しいインストール方法は以下のサイトで説明されています。

パッケージ管理 - pip

pythonのライブラリをインストールや依存関係の管理は、python用のパッケージマネージャであるpipを使います。 ライブラリだけではなく、pythonで書かれたツールや他にpythonに関連するものもこれを使うことになります。 pythonでの開発には欠かせないでしょう。

また、標準でeasy_installというインストーラCLIもありますが、pipの方がパッケージ管理において優れています。

基本的にはpip install some_libraryみたいにインストールコマンドを使うことになります。 また、プロジェクトのソースコードを共有する場合に、pyenv-virtualenvを使っていれば、 プロジェクトごとのライブラリの依存関係を再現できるようにpipでインストールしたライブラリ一覧を作成できます。

pip freeze > requirements.txt
pip install -r requirements.txt

上記のコマンドのように、pip freezeでインストールしたライブラリ一覧をrequirements.txtで出力し、 pip install -r requirements.txtrequirements.txtの一覧からライブラリをインストールします。 使えばわかると思いますが、依存関係にあるライブラリのバージョンも保存されるので再現性を担保しています。

pyenvを導入した場合には既に使用することができます。

コードチェック

flake8

flake8はpythonの型チェッカーです。エラーチェックとコーディングスタイルチェックができます。 pythonのコーディングスタイルであるPEP8のルール通りに書けているかを確認します。 コーディングの初心者でもPEP8のルールを守れば大体コードが綺麗になります。 pythonのlinterはいくつかありますが、使った中では一番使いやすかったです。

flake8の機能を拡張するlintツールもあり、flake8以外のlintツールが気になる方は以下の参考記事を読むと良いでしょう。

mypy

python3から型を宣言できるようになりました。しかしpython3自身には型チェックをする機能はありません。 mypyというlintツールが存在し、mypyで型チェックが可能です。 変数や引数の型指定だけではなく、javaで言うところのinterfaceが使えるみたいです(使いたいとは思っていますが、まだ試してもいません) ただし、mypyを使う風潮はまだ浸透していないようで、非公式の記事が少なかったり、ライブラリでの対応がされていなかったりします。

...と思いましたけど、どうやらpycharmという統合開発環境ではしっかりサポートされているらしいです。 mypyに関しては使い込んでからまた記事にしたいですね。

インタプリタ - ipython

python自体にインタプリタの機能が備わっていますが、ipythonというより便利なインタプリタがあります。 通常のpythonインタプリタとは異なり

  • シンタックスハイライトがされている
  • TABキーで自動補完ができる
  • インタプリタ内でシェルコマンドが使える(もちろんcdワークスペースとなるディレクトリの移動もできる)
  • 専用の文法が追加されている
    • オブジェクトの末尾に?をつけるとドキュメントが見れる
    • ベンチマークテストをするコマンドがある
    • その場でデバッガを起動できる

など便利な機能が揃っています。ちなみにカスタマイズもできるそうです。

pipでインストールできます。

pip install ipython

また、ipython以上に便利でGUIで使えるjupyterというツールもありますが、 データサイエンス編で紹介したいと思います。

仮想環境 - Docker

作成したアプリケーションを仮想環境上にデプロイする例もありますね。使ったことがある人もいると思います。 pythonで開発する場合も例外なく使えるケースがあります。特にDockerは不必要な依存関係を断ち切ったり、 再現性も担保できますからね。web開発以外にも、データサイエンスで使えることもあります。

OSXならhomebrewで、WindowsLinux公式のインストール方法(英語)を参照してインストールできます。

また、Docker上の仮想環境でGPUで計算を行うためにnivida-dockerという便利な拡張がありますが、 これもデータサイエンス編で紹介します。

テスト

nose

そもそもpythonで標準のテスト用ライブラリ(unittest)が存在しますが、自分はnoseを使っています。 出力結果の確認や実行時間のベンチマークテスト、カバレージ評価などテストに必要な機能はもちろん揃っています。

pipでインストールできます。

pip install nose

また、書いたテストを実行する場合にはnosetestsというコマンドでテストを実行できます。

実際に導入する場合には、後述のプロジェクト構成に載せた参考記事を読むと良いでしょう。

tox

プロジェクトによって複数のpythonのバージョンで動作をする必要がある場合にtoxが有効です。 toxは複数バージョンのテストを同時に行うことができます。tox.iniという設定ファイルに pythonのバージョンや依存パッケージ(requirements.txt)、使用するテストツールを書けば、 toxコマンドで複数バージョンにおけるテストを実行できます。 また、公式でjenkinsで使うための機能もあるようで、CIとの親和性も高いようです。

pipでインストールできます。

pip install tox

自分自身に関して言えば、実際に使ったことはないですが、要件定義の際に知っておくべきツールだと思いました。

プロジェクト構成

pythonアプリ開発をしたり、ライブラリを作って公開するには、どういうディレクトリ構成が良いか、 自分は以下の記事がとてもよくまとまっていると思いました。特に実務やOSS活動をする場合には 一読することをお勧めします。

プロジェクト構成以外にもパッケージの作り方やテストの書き方も記載されておりとても参考になります。

勉強方法

基礎

現在、検索すればpythonの入門講座をすぐに見つけることができ、簡単に勉強できるようになっています。 メジャーなものだとドットインストールとかが挙げられますね。 コーディングも初心者という方はpaiza learningProgateで勉強することをお勧めします。

発展

pythonでのコーディングができるようになり、pythonについてもっと勉強したいという方は やはり実際のpythonコードや公式ドキュメントに触れるとより力がつくと思います。

特に公式で導入されているユーティリティライブラもありますが、実際のところ知名度が低かったりし、 また新しいバージョンで導入された機能を勉強するためにも、公式のドキュメントを読むことはお勧めします。

公式ドキュメント

日本語のドキュメントも存在し、充実しています。英語に抵抗がある場合にはこちらを読むと良いでしょう。 初心者はチュートリアルpythonの基礎知識の確認および補完し、ライブラリーリファレンスでユーティリティライブラリを勉強すると良いでしょう。

github

実際のコードを読むといったらやはりgithubでしょう。 まずは、Github Trendingで有名なpythonライブラリに触れてみてはいかがでしょうか。

PEP (Python Enhancement Proposal)

コーディングやドキュメンテーション作法はPEP (Python Enhancement Proposal)で学べます。 会社のコーディング規則があったり、実際にそれが公開されているケースもありますが、いずれの場合でも基本はこれに従っています。 ゴリゴリ書く人は必読でしょうか。

終わりに

これを書くだけでもコンテンツ量が多いし、エディタやCIに関しても書きたかったけど力尽きた... 執筆し始めた時は網羅的なコンテンツになると思っていましたが、意外と失念していたものもありました。 余裕ができたらアップデートしたりします。

これがpythonで書くきっかけとなってくれれば幸いです。 また、「こっちの方が便利だぞ」みたいなコメントも遠慮なく受け付けています。

引き続き他の章を公開していく予定なので応援お願いします。