これまで Namba やら Pypy やら、(競プロ界隈で)高速化を簡単になる仕組みを見ては手をだしてきたけど、 Codon というコンパイラが来たようなのでちょっと試してみました。
環境
Windows 11 で VSCode を使っています。
インストール
- 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()はエラー。
C, D = list(map(int, sys.stdin.readline().rstrip().split()))
error: 'File' object has no attribute 'readline'
- ABC428 D では、
math.isqrtが使えれば、すこしコードが楽になりますが、それも使えず。-
math.sqrtはあります
-
新ジャッジが流れてしまったので、まだ速度差は試せていません。
Codon のドキュメントです。