#はじめに
今O'ReillyのハイパフォーマンスPythonを読んでいるところなのですが、
7章のCythonを動かす際にインストールに手間取ったので、その時のメモをアップします。
(因みに初投稿です。)
#Cythonとは?
Pythonを高速化するためのパッケージ。Pythonコードの一部をC言語に書き換えてコンパイルし、Pythonから読み込めるモジュールを作成してくれる。
#動作環境
Windows10 Home Edition
Anaconda 4.3.30
#手順
###前準備
-
仮想環境を作成する
上掲書ではPython2系を使用していましたので、それに合わせてPython2.7の仮想環境をcondaで用意します。
自分はAnaconda NavigatorのEnvironmentsから作成しました。ここでは、cython_py27
という名前を付けました。 -
Cythonをインストールする
続いてEnvironmentsからTerminalを開き、condaでCythonを入れます。
conda install cython
-
GitHubからサンプルコードをダウンロードしてくる
上掲書のコードはこちらから入手できます。
今回は、7.6節のJulia集合を高速化するコードを使います。
仮想環境をactivateさせたコンソール上でcythonfn.pyx, julia1.py, setup.pyを置いたディレクトリから
python setup.py build_ext --inplace
とすれば.pyxファイルがCに書き換えられて.pyファイルから読み込めるようになる…はずなのですが、
デフォルトの状態ではCのコンパイラが入っていなかったため、error: Unable to find vcvarsall.bat
と表示されコンパイルできませんでした。
###Visual C++をインストールし、PythonにPATHを認識させる
-
Visual C++ for Python2.7をインストールする
Python2.7にはそれ用のCのコンパイラがあったので、まずはそれをMicrosoftのサイトからダウンロードしてきます。
ダウンロードが終了したらそのまま実行し、インストールしましょう。
<参考サイト> http://chachay.hatenablog.com/entry/2016/06/06/233734 -
vcvarsall.batファイルの場所を確認する
インストール自体は、どこにファイルを置くか等を一切聞かれずに終了します。
これが実は曲者で、初見ではわかりにくい場所に置かれるうえ、そのままではPythonからも読み取ることができません。
まず、問題となっているvcvarsall.batは
C:\Users\(user名)\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\
の中に入っています。
<参考サイト> http://hhsprings.pinoko.jp/site-hhs/2015/02/microsoft-visual-c-compiler-for-python-2-7%E3%81%AF%E3%81%B2%E3%81%A8%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AA%E3%82%89%E3%81%9A/ -
ライブラリdistutilsをいじって上記ファイルを読み込ませる。
setup.pyからimportしているdistutilsのうちの中にあるmsvc9compiler.pyで、使用するコンパイラのPATHが指定できます。
C:\Users\(user名)\AppData\Local\Continuum\Anaconda3\envs\cython_py27\Lib\distutils/msvc9compiler.py
これを適当なエディタで開き、下記のサイトに従って書き換えます。
http://chachay.hatenablog.com/entry/2016/06/06/233734
「1. Python 2.7へVisual C++の設定」に従い、関数find_vcvarsall()
内に以下のコードを挿入してください。
vcpath = os.environ['ProgramFiles']
vcpath = os.path.join(vcpath, 'Common Files', 'Microsoft', 'Visual C++ for Python', '9.0', 'vcvarsall.bat')
if os.path.isfile(vcpath): return vcpath
vcpath = os.path.join(os.environ['LOCALAPPDATA'], 'Programs', 'Common', 'Microsoft', 'Visual C++ for Python', '9.0', 'vcvarsall.bat')
if os.path.isfile(vcpath): return vcpatc
http://chachay.hatenablog.com/entry/2016/06/06/233734 より
###実行する
ここまで来てようやく実行できるようになりました。
中間ファイルcythonfn.cとともに、.pyから読み込むためのcalculate.pydが生成されます。
> python setup.py build_ext --inplace
> python julia1.py
因みに、実行時間(Wall time)は素のPythonから7.07s -> 4.9sまで短くなりました。
#おわりに
いろんなところから情報を拾ってこなくてはならず疲れました。
内容の間違い、用語の使い方の誤り、レイアウトや記法等これ良くないよ・こうした方がいいよとかあったら是非コメントいただけると嬉しいです。
それにしても、わざわざWindowsでやる意味あるのかな、、、
※追記・2018年12月16日
新しい仮想環境作成するたびに上記の作業をしなきゃいけないのが面倒なので、
最近はDockerで作業用Linuxコンテナを作成して動かしてます。
基本apt-get
とpip
だけで全部入るのでめっちゃ楽。
そのうちDocker導入~環境構築の方法も記事にします。
(先日注文したMacbook Proが届くまでには書かないと...)