Pythonの高速化技術。JavaScript,C++にも負けてない

書きかけです。時間なく、駄文を撒き散らしながら加筆・修正していきます。

-------

Pythonには大変お世話になっております。

Pythonは科学計算が得意で、データ解析もできる。単独開発なので、Pythonはなくてはならない言語。

Pythonの良いところ
1. 科学(統計, AI etc)ライブラリの豊富さ
Pythonの悪いところ
1. 遅い, 遅い, 遅い...

## CPythonは遅い


遅いのは、サービス運用にとって採用されない要因になるかと。大規模運用に関して早いは重要。
(ただ、CPythonは高速化より、Pythonの可能性を広げる事に注力しているものと思われますので、別の高速化の手立てを用いられるのが最良かと）

言語速度が早いとなると、運用システム規模が単純に減らせられる。例えば、現在使っているシステムでVPS100台が1/4の25台になれば、VPS使用量コストは1/4。管理負担も1/4。ただ、人は記憶容量のキャパが決まっているので、そのキャパを超えてしまうので、2人を雇っていたのが1人になれば、なお、運用コストを抑える事ができる。

Pythonは計算用途言語というなら実行速度だって早い方が良いに決まっている。1日1回しか結果が得られないより、10倍早い言語で10回得られた方が仕事は進む。

Numpy, Scipy駆使で早くなるって？ 学習コストが低いままで高速なJSがあるのだから、あぐらをかいては科学計算用途の地位が奪われてしまいかねない。開発に要するスキルと、計算機アーキテクチャに精通するスキルは違う、Python開発できるような人間はアーキテクチャに精通しているから当然と思うかもしれないが、その知識がないと高速化できないのなら多くは、Pythonから離れてしまいかねない。

加えて、データ解析のアドバンテージがある限り、Pythonは遅くても目を瞑っていられる。ただ、こんな状況が進めば、他の言語にこのアドバンテージ首位を奪われてしまえば、Pythonの発展も遅れるでしょう。

あのPython謹製だったDropboxも頑張って独自のPython->C言語transScript[Pyston](https://github.com/pyston/pyston)作ろうとして投資されてました。残念ながら、2017に「支援は」終焉。DropboxはGo,Rustなどが使われる事に。

Python好きだからこそ、大規模もPythonで組みたい。

~~だから、開発者の方に知ってほしい、**今Pythonを高速化は必須。IDEの開発でも下記、最適化ツールへの対応は重要な要件じゃないでしょうか**。是非、ご検討願いたい。~~

Pythonだけで開発できれば開発者も学習コストが減って幸せになれる人も現れるでしょう。そのためには、投資できるならしたい。

MacBookPro 2018
- RAM 32GB
- i9 2.9GHz

## 高速化の方策: PyPy>=Cython>>>JITCompiler(Numba)>>>他
PyPyはCPythonインタプリタの置き換えです。置き換えだけで早くなります。

次に、Cythonでしょう。静的型付けでより、高速化できる上に、Native化して、コード読み見にくくなります。

Numbaは最適化できる範囲が上記に比べ限定的であり、Cythonを使えると優位性を主張しにくいと思っております。

他は、情報量がすくないので、便利そうで使うのが怖い。もちろん、その情報は頑張ってくださっている方が残してくださる物であり、ありがたいのですが、時間がない、シェアがないとツール自体が最新Python文法に対応しなくなる恐れがある。（今はフリーリポジトリがあるので、なくなりにくいですが）

CPythonが遅いのは仕方なく、Pythonという人格ともいう骨格を形成するのに特化しているのでしょうね、「Pythonでできる事」を増やしており、最適化の仕事は別と割り切られていらっしゃるのだろうけど、やっぱりOffice高速化は欲しいところ。

## PyPy: PythonによるPython Interpreterの実装

1. 下記通り、PyPyは高速。CPythonに比べて動かないコードもあるのだが、**Pythonの主流をPyPyへ移し、C言語との連携をスムーズ化できる仕組みを広がれば、Pythonは遅くとはいわせないんじゃないか**、と思う。
1. たしか、Pycharm(Pro版のみ?)ならpypyも扱えたはず。VSCodeはpypyのインタプリタ・バイナリを認識しないので、未だ私は実現できていません@2021.7.25

### ある記事の遅いPythonコードをPyPyで実行
1. [2019年の後半。いま、高速で生産性の高い開発言語はなに？！旬の言語 C++, C#, Javascript, Python で比較してみた！](https://qiita.com/james0827/items/b69fd64a16d66cbe9327)
では、「パターンC, 同僚の「Oさん」が書いたシンプルにdoubleのみで計算するコードをさらに山崎さんがリファクタリングしたコード」のPythonの実行速度は「C-4. Python(計算時間: 121.914秒)」と下記他の言語と比べて鈍足。

下記は、上記サイトから引用させて頂いております。下記「C」行が本改良対象です。

| code | VS2019/C++ | MinGW/C++ | node.js/Javascript | VS2019/C# | Python   |
| ---- | ---------- | --------- | ------------------ | --------- | -------- |
| A    | 278.973    | 165.098   | 456.066            | 458.992   | 1148.174 |
| B    | 216.595    | 134.391   | 123.56             | 287.459   | 3722.021 |
| C    | 2.6        | 0.608     | 0.756              | 1.847     | 121.914  |

- 引用元: [2019年の後半。いま、高速で生産性の高い開発言語はなに？！旬の言語 C++, C#, Javascript, Python で比較してみた！](https://qiita.com/james0827/items/b69fd64a16d66cbe9327) @ 2021/7/24。
  
上記「C」行ではPythonは「121.914秒」。私の環境でもVSCodeでのrunは130sec. python3.9.4での実行結果は66秒。

brewでInstしたPypy3(v7.3.5)では、下記通り**__1.5sec__**と**約44倍も高速**になった。
```python
start
3.141592651589258
1.5206398963928223  sec.
```

十分、高速化された。
JSに比べて遅いが、**解析も開発も1言語で戦えるメリット考えたら、悪くはない**。

## Cython: Transcoder to C-lang.
1. `.pyx`ファイルはPycharm Proでデバッグできる。これによって世界変わるんじゃないかと思う。`.pyx`はCythonのコード。

## Numba: JIT compiler

## cache, memo
1. anycache: pickleを使ったmemorize, cacheライブラリ
2. expiredict: session代わりに使う？Beakerの使い方がよくわからない...