CPython / pypy / Cython / Codon
https://scrapbox.io/files/68bc5714874715a903d33f84.png
09/25追記↓
Kaplam.icon不具合の修正提出がまだ終わらないのでさらに1週間遅れるそう、早くCodon使いたいのに_(:3」∠)_
09/17追記↓
Kaplam.icon不具合報告が多い&ちゃんとテストされていない言語も複数あるということで1週間延期になって9/29の週のADTから新judgeテストになったそうです、それで問題なければ~なので10月中にABCに来る感じかも
Kaplam.icon早ければ10月初旬にCodonが通常のコンテストで使えるようになるそうなので落書き
・結論
普段使いはpypyかcodonお好みで(Kaplam.iconはcodonへ書き換える可能性も意識しつつpypyで書くかも、どの道ICPCは未だにpython3.9使ってるぐらいで少なくとも来年までにcodon使えるようになったりはしないだろうし)
TLEした場合、深い再帰ならCPythonをお試し、それでもダメで余計な探索や遅い書き方してなかったらCodon
Codonが深い再帰についてどうかは未検証 ←pypyと比べて高速っぽい? 正式に使えるようになってから改めて検証かも
・CPython
普通のPython
% python A.py
デメリット:他より遅い
・pypy
pypy
% pypy A.py
メリット:CPythonより明確に速い、というかCPythonは遅すぎて正攻法でもよく落ちる
デメリット:深い再帰が極端に遅くなる、Cpythonと比べると導入に手間がかかる、文字コード関連で少し困ることがあるかも
・Cython
C言語っぽく書くと速いpython
% コンパイルがいる(実行方法覚えてない)
メリット:状況によって速い
デメリット:高速化にコード書き換えないといけないのに手間かけてpypyより遅い時があるし実行もめんどくさいのでこれ使うぐらいならC++でいい
・Codon
(Kaplam.iconがまだローカルに入れてないので入れてからちゃんと書くかも、スクショも雑)
今度新しく追加される予定のpythonコンパイラ
% codon run A.py
pypyと同じく基本的にはCPython同様のコードで実行できるけど、Cythonみたいに強い型制約がかかる
https://scrapbox.io/files/68bc51bcc92a6c67220d6fc8.png
とか(異なる型を == で繋いではいけない)
https://scrapbox.io/files/68bc5291460faac427434ee6.png
とか(ひとつのlistに異なる型を入れてはいけない)
https://scrapbox.io/files/68bc53fcea5e4c435809a843.png
とか(同じ関数でreturnが異なる型だとダメ、コンパイラは自動的に def d(n:int) -> int: としていたのにTrueを返すところが来た)
https://scrapbox.io/files/68bc54661d9aa01bd97422a3.png
とか(なぜかexitがないらしい? sys.exit()で対応可能、他にもpythonにあってcodonにないものがあるかも)
でエラーが出る
https://scrapbox.io/files/68bc54e30c32f4b5fe0aa222.png
これはいいらしい(C++だと出来ない)
入力例はサンプル3
上がpypy,下がcodon
return Falseじゃなくて変なの返してるのは上記のreturnの型を変えられないのが原因,
https://scrapbox.io/files/68bc585cc1879e53c2687f74.png
他が二次元list返してるのにbool返してるのあるんだけど! と怒られる(英文逆の方がしっくり来るけど、Falseというbool型を返しますよと言ってる所で、他がList返すって言ってるんだけどって言い方にしてる?)
https://scrapbox.io/files/68bc55080cb95565c513b150.jpg
https://scrapbox.io/files/68bc55120cb95565c513b1ad.jpg
元コードが雑過ぎてかなり余計な探索してるからまだTLEしてるけど逆に言えばそれでも収まりかけるぐらいには速い、元コードは関数呼び出しのオーバーヘッドがかなり大きそうだから違う例だと速度比大きく変わるかも
あとメモリ使用量がかなり少ない
メリット:pypyより速そう
デメリット:型制約に気を付けないといけない、他の人のコードとか引っ張ってきても動かないことがありそう、ドキュメントが少ない、導入がめんどくさい(Windowsには対応しない方針っぽくてWSL使えって言ってる)
コードテストでの使用は以下のテスト用コンテストから
codonのページ
以下追記
仕組み見てこれ配列外参照どうなるんだと思って試してみた、なんか変な記号使ってる? [0m って文字色つける時に使う文字列だけど...ローカルで実行してみたらわかりそう
https://scrapbox.io/files/68bc5cc6be88e2bc0b8c1cf8.png
https://scrapbox.io/files/68bc5cb838aeed184a994bda.png
0割りについてエラー出ないっぽくてちょっと普段使い怖い、しかも割り方によって解変わるし
1/(1-1) とか書く場合は静的解析で0割りエラー出してくれる
https://scrapbox.io/files/68bc5e2832033f5f940514b2.png
https://scrapbox.io/files/68bc5e31ea5e4c435809df56.png
https://scrapbox.io/files/68bc5e56b798fca0c61bd227.png
https://scrapbox.io/files/68bc5e675297735ea62b9371.png
メモ
intが固定長らしい
実験してみたら
def saiki(n):
if n == 0:
return 0
else:
return saiki(n-1)+1
の再帰で最初にn = 10**11 を渡しても10msぐらいで返してくるのでC++みたく強烈な最適化がかかるっぽい
でも
def saiki(n):
if n == 1:
return 1
else:
return saiki(n-1)*n%mod(998244353)
で10**7渡しても120msぐらいで返してきた(pypyは>10s)から再帰については弱点ではないと思ってよさそう?
再帰回数の上限とかは上げなくていい(というか上げる構文が弾かれた)
functoolsにはcacheなんてないって怒られた、なんで? まあ自分で辞書作ればいいだけだけど
numpyやsortedcontainersは
from sorted...
としたら入れられないけど
from python import sorted...
で入れられる、ちゃんと動いてそう