差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン前のリビジョン次のリビジョン | 前のリビジョン次のリビジョン両方とも次のリビジョン | ||
programming_algorithm:python_tips [2020/07/03] – [Numba] ikatakos | programming_algorithm:python_tips [2020/07/03] – [実装例] ikatakos | ||
---|---|---|---|
行 253: | 行 253: | ||
競プロの文脈でポイントとなるのは、以下だろう。 | 競プロの文脈でポイントとなるのは、以下だろう。 | ||
- | * 高速化のため、NoPythonモード、事前コンパイルする | + | * "NoPythonモード" で "事前コンパイル" |
* 使わない方がよい問題もある | * 使わない方がよい問題もある | ||
* 文字列の方が扱いやすい問題とか、多倍長整数が有効な問題とか | * 文字列の方が扱いやすい問題とか、多倍長整数が有効な問題とか | ||
行 276: | 行 276: | ||
* [[http:// | * [[http:// | ||
+ | |||
+ | <WRAP center round box> | ||
+ | AtCoderのジャッジシステムでは、テストケース実行前に提出コードをコンパイルするフェーズがある。 | ||
+ | スクリプト言語にとっても起動を速くする効果があったりするため、行われている。 | ||
+ | |||
+ | * 下記ページ中の「コンパイルコマンド」がコンパイルフェーズに実行される | ||
+ | * [[https:// | ||
+ | |||
+ | Pythonでは '' | ||
+ | Numbaでのコンパイルも、このコンパイルフェーズを利用して行う。 | ||
+ | </ | ||
つまり、以下のいずれかを行えばよい。 | つまり、以下のいずれかを行えばよい。 | ||
行 298: | 行 309: | ||
コードをスッキリと保ちたいならJIT、ギリギリまで速度を求めたければAOT、でよいと思う。 | コードをスッキリと保ちたいならJIT、ギリギリまで速度を求めたければAOT、でよいと思う。 | ||
- | === AtCoderのジャッジシステムの仕組み === | ||
- | |||
- | AtCoderのジャッジシステムでは、テストケース実行前に '' | ||
- | |||
- | * [[https:// | ||
- | |||
- | C言語などにとってのコンパイル処理をするフェーズだが、 | ||
- | スクリプト言語にとっても起動を速くする効果があったりするため、行われている。 | ||
- | |||
- | Numbaでのコンパイルも、このコンパイルフェーズを利用して行う。 | ||
- | コンパイルフェーズで生成されたファイルは削除されず残る。 | ||
- | |||
- | ただ、ファイルが残る仕様は悪用しようと思えば色々できてしまうと思うので、もしかしたら将来的になくなるかも知れない。 | ||
=== ローカル環境でのAOT === | === ローカル環境でのAOT === | ||
行 361: | 行 359: | ||
* それぞれを個別にコンパイル | * それぞれを個別にコンパイル | ||
- | * 1つの大枠の関数の中で個々の関数定義も書いて、大枠の関数のみコンパイル | + | * 1つの大枠の関数の中で個々の関数定義も書いて、大枠の関数のみコンパイル(関数内関数) |
前者は関数毎にコンパイル指定(JITなら'' | 前者は関数毎にコンパイル指定(JITなら'' | ||
後者は大枠関数のみの指定で特に問題なく内部の関数も型推論してくれる。 | 後者は大枠関数のみの指定で特に問題なく内部の関数も型推論してくれる。 | ||
- | 普通に後者でいいと今のところは思っている。 | + | ただし、Numbaの内部関数が再帰を含む場合、それはコンパイルが通らない。 |
+ | |||
+ | numba.core.errors.NotDefinedError: | ||
+ | |||
+ | 通常は1つの大枠関数に入れた方が手間が少ないのでそうし、再帰関数のみ個別にコンパイルする。 | ||
==== 独自クラス ==== | ==== 独自クラス ==== | ||
行 374: | 行 377: | ||
AOTでのコンパイル方法は探したけど見つかってない。 | AOTでのコンパイル方法は探したけど見つかってない。 | ||
- | クラスは一連の処理をまとめて理解しやすくしてくれる点はあるが、競プロのような短いコードでは必須でもないので、今のところはクラスを使わない書き方で対処する方針で。 | + | クラスは、1つのオブジェクトに関係する処理をまとめることで理解しやすくしてくれる点はあるが、競プロのような短いコードでは必須でもないので、今のところはクラスを使わない書き方で対処する方針で。 |
* [[https:// | * [[https:// | ||
行 382: | 行 385: | ||
=== AOT === | === AOT === | ||
- | 以下を参照させていただいた。あまり変わっていないが、手元環境でも同一コードで動く。 | + | 以下を参照させていただいた。あまり変わっていないが、手元環境でも同一コードで動くようにした。 |
* [[https:// | * [[https:// | ||
- | 手元環境がWindowsであることを前提としており、'' | + | ローカル環境がWindowsであることを前提としており、'' |
- | MacやLinuxなら、'' | + | MacやLinuxなら、'' |
基本的に '' | 基本的に '' | ||
- | |||
- | 処理を切り分けるものの、見た目的にあまり階層は深くしたくない。参照させていただいたコードはその点も配慮されていて、メインで記述する箇所が十分浅く、書きやすい。 | ||
++++ 実装例 | | ++++ 実装例 | |