個人用メモ： AnacondaでCythonを使うための設定

# 目的
+ 自宅PCのAnacondaを再インストールしたらCythonの設定にてこずった
+ 別のPCで設定するときの備忘録として作業手順を整理

# 環境
+ CPU: Intel系
+ OS: Windows 10 version 1909 64bit
+ Anaconda: 3 (Individual Edition)
+ Python: 3.7[^1]
+ Cython: 0.29.17

# 作業手順
## 1. Anaconda
### 1-1. 本体のインストール
1. [本家サイト](https://www.anaconda.com/products/individual)からインストーラをダウンロード
2. デフォルト設定でインストール

### 1-2. 初期設定
+ base環境の設定（Anaconda Promptから[^2]）

```
conda config --remove channels conda-forge
conda upgrade --all
conda clean --packages
```

### 1-3. パッケージのインストール
+ 仮想環境の作成

```
conda info -e
conda create -n [仮想環境名] anaconda
```

+ 仮想環境にパッケージを追加（[コマンド一覧](https://qiita.com/naz_/items/84634fbd134fbcd25296)）

```
activate [仮想環境名]
conda list
conda install [パッケージ名]==[バージョン]
```
|分類  | パッケージ |
|:-:|---|
| 最初から入っているもの | numpy, scipy, sympy, pandas, matplotlib, seaborn, jupyter, jupyter_console, jupyterlab, cython, numba, xlwings, scikit-learn, scikit-image, statsmodels, pytest, yaml, h5py, requests など |
| 入っていないもの | opencv, tensorflow2, mayavi, pcl, pymc3, scikit-rf, fortranコンパイラ など |

+ 仮想環境情報の書き出し

```
conda env export -n [仮想環境名] > [ファイル名].yaml
```
+ 動作確認： [Anaconda3] から [Jupyter Notebook (仮想環境名)] を起動してみる。

## 2. Cython用の設定

### 2-1. Cコンパイラの選択
コンパイラの選択は、[CythonのGithubサイト](https://github.com/cython/cython/wiki/CythonExtensionsOnWindows)の解説にしたがった。
本当はAnacondaで完結させるためにmingwを使いたいのだが、[Githubサイト](https://github.com/cython/cython/wiki/CythonExtensionsOnWindows)に使わないように注意書きがあったので今回は断念[^0]。また、Windows SDK C/C++ compiler は Python3.7 の情報がなかったので、これも敬遠。
ということで、今回は Microsoft Visual C++ をバージョンを合わせてインストールする方法を選択[^3]。その場合の手順は以下の通り。

### 2-2. Pythonをコンパイルした Visual C++ のバージョンを調べる
+ Anaconda Prompt で Pythonを起動する

```
(base) c:\Users\foo>python
```
+ Pythonの詳細情報を表示する

```
>>> import sys
>>> sys.version
→　3.7.7 (...略...) [MSC v.1916 64 bit (AMD64)]'
```
+ 表示された情報（MSC v.1916）を以下のサイトの対応表と照らし合わせると、Python のコンパイルに使われた Visual C++ のバージョンが分かる[^5]。
  - [Wikipedia: Microsoft_Visual_C](https://ja.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B)
  - [@yumetodoさんのサイト](https://qiita.com/yumetodo/items/8c112fca0a8e6b47072d)

### 2-3. Cコンパイラのインストール
+ [Microsoftのサイト](https://docs.microsoft.com/ja-jp/visualstudio/releasenotes/vs2017-relnotes) に行って、該当するバージョンの「Build Tools for Visual Studio 2017」をダウンロードしてくる。言語を「Japanese」としてから「Download」ボタンを押す[^4]。ちなみに、[Python Japanサイト](https://www.python.jp/install/windows/install_vstools2017.html)の説明とは若干画面が変わっていた。

+ ダウンロードしたexeファイルを実行すると、Visual Studio Installerがインストールされる。ここで改めてインストールするオプションを選ぶ。インストールするのは「Build Tools for Visual Studio 2017」。「Visual C++ Build Tools」にチェックボックスを入れてからインストールする[^6]。Visual Studio Community 2017 も無料でインストールできるが、Cythonを動かす目的のためには不必要。[Microsoftのダウンロードサイト](https://visualstudio.microsoft.com/ja/visual-cpp-build-tools/)にも、Cythonで使うのは「Build Tools for Visual Studio 2017」であることを示唆する表示がある。

+ Cythonが参照するファイル「vcvarsall.bat」が以下の場所にできていることを確認

```
C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Auxiliary\Build
```

## 3. Cythonの動作確認
### 3-1. テストスクリプトの実行
+ Jupyter Notebook を起動
+ 以下のコードを入力して実行してみる

```python:Cell1
%load_ext Cython
```
```python:Cell2
%%cython
def cy_fib(n):
    a, b = 0.0, 1.0
    for i in range(n):
        a, b = a + b, a
    return a
```
```python:Cell3
%timeit cy_fib(100)
```

### 3-2. それでもうまくいかない場合の情報源

+ [@kei0425さんのサイト](https://qiita.com/kei0425/items/d9ff587e882c25e2a7e6)： 今回はお世話にならずに済んだが、この先のことが書いてある感じ。
+ [Oreillyの「Cython ―Cとの融合によるPythonの高速化」](https://www.amazon.co.jp/Cython-%E2%80%95C%E3%81%A8%E3%81%AE%E8%9E%8D%E5%90%88%E3%81%AB%E3%82%88%E3%82%8BPython%E3%81%AE%E9%AB%98%E9%80%9F%E5%8C%96-Kurt-W-Smith/dp/4873117275/ref=cm_cr_arp_d_product_top?ie=UTF8)： 2015年の本なので若干古いがまだまだ使えそう。背景理解のため。

[^0]: Oreillyの本ではmingwでも行けるとのことだったが、Githubのほうにしたがった。ただし流し読み。
[^1]: TensorFlow 1.0 は Python3.7 で動くようになった模様。TensorFlow2.0 は未確認。
[^2]: 必要なら管理者アカウントで実行（右クリック）
[^3]: CPython は Visual C++ の長期サポート版でコンパイルされているので、Visual C++ を使えば問題ないとのこと。
[^4]: Microdoftアカウントが必要になるのでなければ作る。
[^5]: 文中の例で言うと、「MSC v.1916」は「Visual Studio 2017 version 15.9.11　14.16」に相当。
[^6]: 実際にはチェックボックスを入れ忘れたので、インストールした後で「変更」した