これまでにscikit-imageのPythonのコードを改変してきました。しかも、とりあえず動けばいいというレベルで紹介してきました。いつまでもそれではあんまりなので、Spyder統合環境を使いながらPythonのコードを改善していく方法を紹介します。
今回の記事は、特に初心者向きの記事です。既にPythonを使いこなしている人には何も有益な情報は含まれていません。
###Spyder統合環境を利用してコードを改善する
Spyder統合環境を利用してコードを改善する方法は、次のブログ記事に詳しい。そこから、よくチェックする部分を記します。
ブログ記事 【シリーズ】「pythonとOpenCVを用いたCVプログラミング」 第5回:SpyderのGUI操作
####" 未使用のモジュールやオブジェクトの警告"
がでるので、不要なimportを削除したり、未使用のオブジェクトを計算しているコードを削除します。
####"後端の余分なスペースの除去(source > remove trailing spaces)"
をしておくことで、SVNなどでバージョン管理する際に、意味のないdiffを生じることを抑制できます。
"pylintによるコード解析 (soucer > run pylint code analysis)"
を実行することで、Pylintで出てくるコーディングスタイルのチェックを行うことで、読みやすくすることができます。
####代入演算子、比較演算子の前後に1つだけスペースを入れる。
####","の後には1つだけスペースを入れる。
####if文の条件式に不要な()をつけない。
ようにコーディングスタイルをそろえるようにチェックできます。
###ドキュメンテーション文字列を書こう
Python チュートリアル ドキュメンテーション文字列
ドキュメンテーション文字列は
def square(x):
"""return square value"""
return x**2
などのように書きます。
"""
もしくは'''
3重引用符を用いると複数行にまたがる文字列を扱うことができます。
そのようにしてドキュメンテーション文字列を書いておくと、次のようにhelpを実行して使い方を表示させることができます。
>>>help(square)
square(x)
return square value
>>>
などとして、他のライブラリと同じようにhelpが使えます。
unicodeを使っている場合には
u"""ドキュメンテーション文字列"""
のようにuの文字を使います。
Python 標準ライブラリ シーケンス型 — str, unicode, list, tuple, bytearray, buffer, xrange
Unicode 文字列はほとんど文字列と同じですが、 u'abc' , u"def" といったように先頭に文字 'u' を付けて指定します。
ファイル中にunicode文字列を含む場合には、スクリプトの冒頭に文字コードを指定を追加しておきます。(追加がない場合、pythonインタプリタが文字列の処理に失敗してエラーを生じることがあります。)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
####pylintが出すwarningを抑制するには
Pythonソースコードの文字コードの指定の後に以下の行を追加します。
#pylint:disable=C0103
文字コードは、スクリプトをテキストファイルに保存する際の文字コードにもきいてきます。
####名前空間を使って出所を明らかにしよう
from pylab import *
のようなモジュールを名前空間抜きで全てimportする書き方は推奨されていません[注1]。
import pylab
のようにモジュール名を明記するやり方を使ってください。
####C++化するのはアルゴリズムをきれいにしてから
C++で実装しなければならないことは多いことでしょう。アルゴリズムを試行錯誤しなければならないときには、データ構造はむちゃくちゃ、変数名はimg2とかtmpとか推奨しかねるでたらめのもの。最初思いついたときとは別の役割をしているので、変数や関数名が、実際のしていることと乖離してしまっているなどということは、言語の種類によらず起こりがちです。使っていない変数が残っていたりとか、不要なimportもしくは不要な#inculdeが残っていたりとかしがちです。
同じ処理をする場合だったら、Pythonの方が行数が少なく、処理の見通しがよいため、リファクタリングがしやすいはずです。Spyder統合環境やpylintなどは、Pythonでのリファクタリングをしやすくしてくれるでしょう。そうして十分明快なコードを書く。そしてテストしたうえで、プロファイルし、精度を損ねないで実行時間を短縮する方法を確かめる。そういった作業は、pythonの方がC++よりも数倍以上やりやすいと感じています。そうして、十分洗練されたアルゴリズムにしてからの方がC++実装の時間が短縮されるはずです。
注1:from pylab import *
と書くと、あたかもMATLABっぽい使い方ができるという利点はありますが、
from cv2 import *
と一緒に書くと
imshow()
がどちらのimshow()なのかわからなくなるので危険です。