これまで Namba やら Pypy やら、(競プロ界隈で)高速化を簡単になる仕組みを見ては手をだしてきたけど、 Codon というコンパイラが来たようなのでちょっと試してみました。
環境
- Windows 11 で VSCode を使っています。
- WSL では Ubuntu 22.04 を使用
インストール
- https://qiita.com/shinpei710/items/0e695315dc653308b582
- https://qiita.com/Tabito/items/14503998d6f3a46eb6f6
こちらの記事を参考にさせていただきましたが、Code Runner は非使用です。
- 素直に Microsoft Store から Ubuntu を入れ、正常にインストール終了にはなりましたが、「その後もディストリビューションが入っていません」のエラーが出続けました。
- その対処は、2つ目の記事にあります。
- WSL に投げるのを簡単にするために Code Runner を使われていますが、通常の Python との切り替えがわかってないので入れずにすませています。
- また、Code Runner 実行をした際に、読み取り専用の出力画面に飛ばされてしまいました。ファイルからテストケースを注入する方法も考えましたが、「従来の Python からお手軽に」するための環境整備などもあるので、パスしました。
- VSCode にタスク登録すれば、ちょっと楽にはなります。
実行
基本、先程の記事を参考に、実行。USERNAME_ON_WSL は WSL で設定した際のユーザー名
wsl /home/USERNAME_ON_WSL/.codon/bin/codon TEST.py
- TEST.py は実行場所からの相対パスで書けば通りましたが、絶対パスで書くと認識してくれませんでした。
- WSL 内から Windows のファイル参照をする際には /mnt/c/ (c はドライブの記号)のように書くようなので、こちらで実施したものは通りました。
- 入力 input() は無事使えました
通常の Python (CPython) との差分(主に競プロ文脈)
とりあえず動かす、は AtCoder ABC428 D の自分の提出コードで実施しました。
また、事前情報として「ほぼ同じだが」差分あり、情報も確認しつつ、トライ。
結果
- map がそのままは動かない。Generator として認識された模様。
- listで囲んでみたら通りました
- tuple はだめでした。
before (error)
C, D = map(int, input().split())
after
C, D = list(map(int, input().split()))
-
input()は使えましたが、sys.stdin.readline()はエラー。- WSL では、
sys.stdinはファイルオブジェクトを指すから? - Python で
print(f"{sys.stdin}")でstdinが指すものを見てみると、Windows 11 上と WSL 上で違う。
- WSL では、
C, D = list(map(int, sys.stdin.readline().rstrip().split()))
error: 'File' object has no attribute 'readline'
-
ABC428 D では、
math.isqrtが使えれば、すこしコードが楽になりますが、それも使えず。-
math.sqrtはあります
-
-
exit()が使えなかった →sys.exit()でつかう- 組み込み関数として
exit()があるが、Codon ではsys.exit()を用いる必要がある。
- 組み込み関数として
速度差
ABC 432 F で試した。 制限時間は 2sec。
| 言語、実行環境 | 実行時間 |
|---|---|
| CPython | TLE |
| Pypy | 404ms |
| Codon | 158ms |
| C++ 23(gcc) ※ | 138ms |
確かに早い。C++ 並みに早い。※C++ のコードは Python コードを ChatGPT にて C++ 23 に変換してもらったものをそのまま使用。
Codon のドキュメントです。