2017年5月1日月曜日

Go から Python へ移行した話

引用元:
http://aial.shiroyagi.co.jp/2016/07/golang-api-server-developing/

Go から Python へ移行した話

1年前は Python から Go への移行が目立っていましたが、最近はその逆もたまに見かけるようになってきました。Python と Go、どちらの言語を選択するかの最も大きな要素は並行性や実行速度に関するものだと思います。Go を試してみた上で実行速度が絶対要件ではないものは Python の方が嬉しい場合があると表明する開発者が出てきました。
このスライドのパフォーマンスのところを抜き出してみます。
  • 一般的に Go は CPython より50-100倍速い
  • PyPy は CPython より5-25倍速い
  • Go の2-10倍の (実行速度という) 範囲内であれば50-100倍に比べれば多くの用途で許容できる
  • Go SSL はピュア Go で実装されている (CPU 負荷が高い、最近の Go はこれを改善している、Cloudflare はマージできない Intel SSL アセンブラコードを用いて大きな改善を行った)
  • PyPy は Game Changer (ものごとを大きく変える存在) だ
ちゃんと調べていないのですが、SSL の話題は Go crypto: bridging the performance gap の記事を指していると思います。比較対象が Go 1.4.2 なのでやや古い記事であるのに注意してください。
閑話休題。PyPy の存在により Go と比べて2-10倍遅い程度なら許容できる場合が多くあると書かれています。PyPy は良い選択肢だと思うのですが、1つ懸念なのは Python 3 互換である PyPy3 の開発がやや停滞気味にみえるところです。現在は 3.3.5 互換のアルファバージョンが公開されています。
こちらの記事は asciinema というターミナルセッションを記録するアプリ開発で Go 実装から Python 実装に変更したというものです。Go の良さも認めつつ Python に切り替えた理由として以下が挙げられています。
  • 並行性や速度を必要としていない
  • Python が高レベル言語であるのに対して Go は低レベル言語です (C言語 2.0 と言うのは正しいと私は思う)。asciinema のコードベースの 95% は高レベルのコードであり、基本的に1つのファイルに select/signal/ioctl/fork のようなシステムコールを含む
  • ビルドの問題: Go 関連の pty/terminal ライブラリは多くのアーキテクチャや OS をサポートしないのに対して、Python は全ての UNIX ライクなシステムで動作する
  • パッケージのバージョン管理がない、中央リポジトリがないといった Go の機能不足はパッケージ管理を面倒にする
  • バッテリーインクルード: asciinema では argparse, pty, locale, configparser, json, uuid, http といった Python の素晴らしい標準ライブラリを使っている
  • ネイティブパッケージのメンテナーにとって外部依存関係が少ないほど嬉しい。現時点では asciinema の外部依存パッケージはゼロです!
  • int32 を int64 にキャストするのにすぐ飽きる
  • if err != nil { と書くのにすぐ飽きる
このアプリの開発者にとって、アプリの特性を考慮した結果、Go よりも Python の方に開発上のメリットがあるというように読めます。

Go で Python モジュールを開発する

PyCon 2016 のスケジュールを眺めていて以下の発表を見つけました。
Go と Python はそれぞれ C 言語とやり取りできるのに着目し、C 言語を経由してそれぞれの言語のランタイムバリアを超えられるのではないかという考察です。Go から C 言語とやり取りするためのパッケージとして cgo があります。一方、Python から C 言語とやり取りする方法はいくつかありますが、ここでは CFFI (C Foreign Function Interface) を使っています。
実用性はともかく、技術的な興味としておもしろいです。Python の開発者はその文化的な類似性から Go の開発に馴染みやすいと思います。私のように Python でちょっとした Web アプリやツールを作ったりしつつ、Go でサーバーサイドの開発をしているプログラマーはたくさんいるように思います。実際に動くサンプルモジュールを作って Go の net/http と比べて遜色ないパフォーマンスのベンチマーク結果も掲載されています。
ーーーーー
コメント:
python、Go言語、Server Side Swiftの3種類のプログラミング言語はどれも
大変興味が高く、時間さえあれば勉強したいとかんがえております。

0 コメント:

コメントを投稿