LoginSignup
2
4

More than 3 years have passed since last update.

Pythonの高速化について調べたこと

Posted at

背景

機械学習を学び始めて、Pythonに触れて、その流れで競技プログラミング(ほぼ AtCoder)も始めました。様々な問題や解法・考え方に触れはじめる段階では、解答が TLE となってもプログラムがまずいことが大半でしたが、最近は「解法はどうも合っている。どうやってTLEを回避したらいいかわからない」という状況にしばしば遭遇してきました。Pythonあるあるだと思います。
そんな時、 Pypy をとりあえず試せとあるのを見たり、AC の方のプログラムに Numba が使われていたりしました。それぞれにいろんな注意書きがあるものの、回避の仕方がわからないこと多く、その理解の前提となる「何しているの、これ」の知識も少なかったので、色々学んだメモです。

そもそも、Python のプログラム実行までの話を整理

Python 自体はプログラミング言語であって、インタープリタでもコンパイラでもない。Python というプログラミング言語のルールにそって、それを実行できる環境があれば良いわけです。インタープリタとして、通常は CPythonを指すことが多いようですが、当然それ以外にもあって。そして、その一つが CPython より高速に処理できる PyPy があります。

Pythonのインタープリタについてはこちらの記事をご参照ください。

Python はインタープリタ型言語だけど、コンパイルもある。

通常のスクリプトはインタープリタを介して走りますが、コンパイルが全く実行されないわけではない、というのが面白いところで、モジュール類は一旦コンパイルされています。毎回ではなく、更新があったらコンパイルして、そうでなければコンパイル済みのものを使う、ということのようです。

Pythonのコンパイル界隈の話はこちらのサイトをご参照ください。

そして、プログラム中でコンパイル(を指示)して、高速化するのが、Numba ということでしょうか。

Numba って何だ?

Numba
Numba - Wikipedia
numbaでざっくりPython高速化 - Qiita

ふんふん、要するにインタープリタ言語である Python をコンパイルして高速に動作するようにするのね。って、素直にそうですか、というほど知識のない入門者が理解できなかったのが、
- AOTって何?プログラムの中でコンパイルを指示しているのに「事前」ってどういうこと?
ということで、改めて調べてみた話。

AtCoder の提出の流れ

AtCoder で解答を提出すると、そのまま実行されるものだと思っていたのですが、改めてAtCoderのページを見てみると、実行コマンドだけではなく、コンパイル・インタープリタの欄にも記述がある。つまり、仮実行が走って、その後、本実行になる、ということで、この仮実行でコンパイルを掛けて、その情報を使えるようにしておく、というのが、AtCoder にて、Numbaを利用する流れになるということです。(毎回のコンパイルでも効果がある場合もあると思いますが)

ルール - practice contest AtCoder

Numba での実行の流れ

コンパイルの時点で @njitcatch=True でキャッシュしておいたり、コンパイル時の引数 ONLINE_JUDGE を使って、

if sys.argv[-1] == 'ONLINE_JUDGE':

というようなやり方が主流みたいです。

コードテストでも事前コンパイルは可能

ちなみに、ちゃんと事前にコンパイルは流れます。って、C++ とか Java とか考えたら、そうなっていないと困るよね。

終わりに

一通りの Numba の実行はできるようになりました。Numba の制約を理解していないとすぐに引っかかってしまうので、そのあたりは別途。

今まで見た中で、こちらが一番自分の引っ掛かりパターンについての説明が多かったと思います。
Numba のコンパイルが通らなかった時の対処

次は、自分のエラーパターンのメモ、残すつもりです。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4