fc2ブログ

makopi23のブログ

makopi23が日々の生活で感じたことを気ままに綴るブログです。

「エキスパートPythonプログラミング読書会 第二期 14」に参加しました

2013/2/12(火) 「エキスパートPythonプログラミング読書会 第二期 14」に参加してきました。

connpass(告知サイト)
http://connpass.com/event/1727/

Togetter
http://togetter.com/li/454750

以下の書籍をターゲットとした読書会なのです。

エキスパートPythonプログラミングエキスパートPythonプログラミング
(2010/05/28)
Tarek Ziade

商品詳細を見る


場所はいつもの目黒、バリストライドグループさんです。
参加者は主催者さんいれて10名くらいでしょうか。

今回は「12章 最適化: 一般原則とプロファイリングテクニック」が範囲でした。
いちおう予習してから参加しました。以下、予習メモ。環境はUbuntu 12.04 & Python2.7です。


■P.329 Gprof2Dotを使ってプロファイリングの結果をdotグラフに変換する

wgetでgprof2dot.pyを取得後、実行してみようとしたらコケた。。。
どうやら本にも書いてあるようにGraphvizが必要となるようで、apt-getで取得する。
20130212_graphviz1_20130213014943.png

んで再度gprof2dot.pyを実行して統計情報ファイルを読み込ませると、ちゃんと画像ファイルが生成されました。
20130212_graphviz2.png

■P.337 Guppy-PEというメモリプロファイラのインストールと実行

まず、easy_installでGuppy-PEのインストールを試みると、Python.hが無いといってコケた。。。
20130212_guppy1.png

ググってみると、どうやらpython-devというものが必要らしいのでインストールしてみる。
20130212_guppy2.png

再度、easy_installでGuppy-PEをインストールしてみると、警告を発しながら今度はコケずにインストールできた。
20130212_guppy3.png

で、Guppy-PEのhpyという関数を使おうとしてみると、またコケた。。。
20130212_guppy4.png

どうやら _PyLong_AsScaledDouble というシンボルが見つからなかったのが原因らしい。
このシンボル、インストール中のログにも警告で「暗黙的な宣言です」と出てたし。

このあと、easy_installではなくtar.gzを落としてきてソースからインストールしてみたりしたのですが、やっぱりうまくGuppy-PEを使えるところまで持っていけませんでした。
あんま時間がなかったこともあり、この時点で写経は保留し、勉強会で質問してみました。

その際は、清水川さんが実際にGuppy-PEのインストールを試してくださったのですが、Python2.6でやるとOKで、Python2.7だとNGでした。ちなみに私の環境はPython2.7でした。
やっぱeggのファイル名にも2.6という単語が入っていますが、Python2.6じゃないとダメそうです。
Pythonは2系と3系でだいぶ異なりますが、リビジョンの差異でもこーゆーことあるんですねー

こっから、勉強会での書き殴りメモ↓ 性能やプロファイラの話が中心です。


■Eclipseも起動は遅いが、起動した後は早い。起動は1回だけなので、ここを早くしようと頑張っても嬉しくない。
 同様に、Webアプリケーションの起動時間を早くしようと頑張るのも同様、あんま嬉しくない。

■Pythonの場合、モジュールのグローバル変数へのアクセスは、ローカル変数へのアクセスより遅い。
(C言語とは異なるので、グローバル変数を使用して高速化しようとするのは無意味)

■2章で出てきたリスト内包表記を使うと、Pythonが早いコードにコンパイルしてくれることがある。
 ただしソースコードの可読性を落とすのは良くないので、バランスが大事。

■Pythonでも +演算子による文字列連結は遅い。
 (Javaも1.4までは遅かったので+ではなくStringBufferを使ったりしていたのと同件)
 ループ内で+演算子で連結するのではなく、append関数でいったん配列に入れて、最後にjoinする方が早い。

■最近はUSBのシリアルI/O転送はソフトウェアでCPUパワーを使ってやったりする。

■Decimalで少数20桁の処理しようとすると数時間かかった。
 → DecimalからDoubleにしたら数倍早くなった

■Ubuntuはライセンスの都合上、apt-getでプロファイラがインストールできない

■Pythonのプロファイラのマニュアル: http://docs.python.jp/2/library/profile.html

■-mオプションについて。
-mオプションを使うと、Pythonで実行できるモジュールで、かつmain文があれば実行できる。

【例】
[akanegasaki@ ~/python/expy/section12]$ python -m zipfile -h
Usage:
zipfile.py -l zipfile.zip # Show listing of a zipfile
zipfile.py -t zipfile.zip # Test if a zipfile is valid
zipfile.py -e zipfile.zip target # Extract zipfile into target dir
zipfile.py -c zipfile.zip src ... # Create zipfile from sources

PCにPythonがインストールされていれば、解凍ソフトがなくても上記のように-mオプション使ってZIP解凍できる。

■Pythonの-m指定で便利なモジュール類を紹介しているサイト
 http://www.freia.jp/taka/blog/766/index.html
 http://answer.pythonpath.jp/questions/506/python-m

■cProfileで結果を出力すると、abc順で出力される。
 ただし別のディレクトリにある同じファイル名も隣に表示されてしまい、見分けがつかない。

■pystoneは関数の処理速度を計測するには使える。
 逆に、お客さんから「1秒以内のレスポンス」と言われた場合の計測には使えない。

■いつもpythonコマンドを実行すると、実はシンボリックリンクが貼られていて、python2.7というコマンドが起動されている。

■以下のコマンドでPCのpystone値が計測できる。
 python -m test.pystone

■Pystoneで自動テストをやる際に、pystone値で上限をassertするスクリプトを埋め込んでおけば、リファクタリングの際に劇的に性能が悪くなった場合とかに検知できたりする。

■JPythonとCPythonではメモリの開放タイミングが異なる。
 CPythonは参照カウント方式で、JPythonはマーク・アンド・スイープ方式。
 (このへんはググったらwikiに載ってた: http://ja.wikipedia.org/wiki/Python


★感想:
今回もいろいろ有意義でした。
ケントベックの言葉、なるほどー、と思いましたね。

"まず動かす、次にそれを正しくする、最後に速くする"

誰のための高速化か、を常に意識するのも大事です。

あとPystoneという概念が出てきましたが、こーゆう環境に依存しない性能値の概念は、他の言語でも大事だなーと感じました。

あと今日はビアバッシュではなく外に飲みに行くことになりましたが、私は22時からオンライン上で別件の用事があったのでお先に失礼しました。
次回はビアバッシュとLTタイムがあるといいなぁ。

最後に講師の清水川さんを始め、運営者さん会場提供者さん、皆様ありがとうございました。

テーマ:プログラミング - ジャンル:コンピュータ

-->