AtCoderでPythonとPyPyの速度を比較してみた

[Supership](https://supership.jp/)の名畑です。2023年春アニメは、新作であれば[スキップとローファー](https://skip-and-loafer.com/)が今のところ見た中では最も好きです。[OP](https://www.youtube.com/watch?v=PJirQlsWemk)もかなりセンスよすぎる。

:::note info
AtCoderについて調べてみたシリーズの過去記事
- [競技プログラミング(AtCoder)とはどんなものか](https://qiita.com/nabata/items/44fa3995e476b12b9860)
- [誕生年毎のアクティブユーザ数](https://qiita.com/nabata/items/75407e48c7ca8de8a4a4)
- [アクティブユーザの世代別国と地域](https://qiita.com/nabata/items/28b5572978ee4abb0126)
- [プログラミング言語シェア](https://qiita.com/nabata/items/1f9c0543fad5c6106d19)
- [レーティング別問題解答速度](https://qiita.com/nabata/items/25631d3d1e43f4d9e31f)
- [所属(大学・高校・会社等)別のアクティブユーザ数](https://qiita.com/nabata/items/864e06a52de88123daaa)
- [年齢と使用プログラミング言語の相関](https://qiita.com/nabata/items/7c15a47f6a5caecadcc9)
:::

## はじめに

[AtCoder](https://atcoder.jp/)では問題毎に**実行時間制限**というものが決められています。この時間内でプログラムの実行を終わらせなければいけないという時間的な上限値です。

同じような処理をコードに落とし込んだとしても、プログラミング言語によって実施時間は異なるわけであり、つまりは競技プログラミングにおいてはどの言語を選ぶかというのは一つの重要ポイントになります。

人気言語である[Python](https://ja.wikipedia.org/wiki/Python)には[PyPy](https://ja.wikipedia.org/wiki/PyPy)という処理系があります。実行速度の点で強みがあることからAtCoderではPythonではなくPyPyで提出する人が多くいます。
私もそれに倣いPyPyで提出しているのですが、実際に自分で速度を比べたことがあるわけではありません。

ですので比べてみたというのが今回の記事の内容です。

## 対象

どのような条件でどのようなコードで比較するべきかというのはかなり悩ましいものです。繰り返しや配列操作等の処理別に比較することもできますが、それは**AtCoderにおける速さ**を比較することに果たしてなるのか。

考えた結果、今回については**AtCoderでどちらのコードが速いか**を知りたいという目的のため**実際にAtCoderで提出されたコードでACだったものが何秒かかっているかを集計する**ことにしてみました。

対象のコンテストは2023年4月1日に開催された[AtCoder Beginner Contest 296](https://atcoder.jp/contests/abc296)です。このコンテストを選んだ深い意味はありません。最近のコンテストを選んだというだけです。

このコンテストで開催時間である21:00-22:40の間にされた提出についてACのもののみに限定し**Python (3.8.2)とPyPy3 (7.3.0)のそれぞれで中央値、平均値、最大値、最小値、それと提出数**を表にしてみました。

[G - Polygon and Points](https://atcoder.jp/contests/abc296/tasks/abc296_g)ついてはPython (3.8.2)でのACが、[Ex - Unite](https://atcoder.jp/contests/abc296/tasks/abc296_h)についてはPython (3.8.2)とPyPy3 (7.3.0)の両方でのACがなかったため対象外としています。

## ABC296での結果

### A - Alternately

- [問題はこちら](https://atcoder.jp/contests/abc296/tasks/abc296_a)
 
| 		 | 	Python (3.8.2)	 | 	PyPy3 (7.3.0)	 |
| 	:--	 | 	--:	 | 	--:	 |
| 	中央値(ms)	 | 	25	 | 	71	 |
| 	平均値(ms)	 | 	25.82	 | 	108.62	 |
| 	最大値(ms)	 | 	389	 | 	915	 |
| 	最小値(ms)	 | 	18	 | 	60	 |
| 	提出数	 | 	838	 | 	963	 |

単純な文字列操作の問題です。
どこを比べてもPythonがPyPyよりも速いという結果になりました。

### B - Chessboard

- [問題はこちら](https://atcoder.jp/contests/abc296/tasks/abc296_b)

| 		 | 	Python (3.8.2)	 | 	PyPy3 (7.3.0)	 |
| 	:--	 | 	--:	 | 	--:	 |
| 	中央値(ms)	 | 	25	 | 	71	 |
| 	平均値(ms)	 | 	26.40	 | 	106.51	 |
| 	最大値(ms)	 | 	373	 | 	1358	 |
| 	最小値(ms)	 | 	18	 | 	60	 |
| 	提出数	 | 	780	 | 	932	 |

文字列から該当の文字を見つけ出す問題です。
この問題もPythonがPyPyよりも速いという結果になりました。

### C - Gap Existence

- [問題はこちら](https://atcoder.jp/contests/abc296/tasks/abc296_c)

| 		 | 	Python (3.8.2)	 | 	PyPy3 (7.3.0)	 |
| 	:--	 | 	--:	 | 	--:	 |
| 	中央値(ms)	 | 	171	 | 	155	 |
| 	平均値(ms)	 | 	569.02	 | 	183.33	 |
| 	最大値(ms)	 | 	1932	 | 	994	 |
| 	最小値(ms)	 | 	103	 | 	127	 |
| 	提出数	 | 	453	 | 	909	 |

中央値や平均値ではPyPyに軍配が上がっていますが、最小値がPythonです。書き方に左右される部分がかなりあるってことですかね。

### D - M<=ab

- [問題はこちら](https://atcoder.jp/contests/abc296/tasks/abc296_d)

| 		 | 	Python (3.8.2)	 | 	PyPy3 (7.3.0)	 |
| 	:--	 | 	--:	 | 	--:	 |
| 	中央値(ms)	 | 	482	 | 	132	 |
| 	平均値(ms)	 | 	569.02	 | 	258.73	 |
| 	最大値(ms)	 | 	1744	 | 	1987	 |
| 	最小値(ms)	 | 	122	 | 	62	 |
| 	提出数	 | 	62	 | 	406	 |

ここから先の問題はすべて中央値、平均値、最小値においてPyPyの勝利です。

### E - Transition Game

- [問題はこちら](https://atcoder.jp/contests/abc296/tasks/abc296_e)

| 		 | 	Python (3.8.2)	 | 	PyPy3 (7.3.0)	 |
| 	:--	 | 	--:	 | 	--:	 |
| 	中央値(ms)	 | 	750	 | 	272.5	 |
| 	平均値(ms)	 | 	844.00	 | 	424.95	 |
| 	最大値(ms)	 | 	1853	 | 	1903	 |
| 	最小値(ms)	 | 	135	 | 	117	 |
| 	提出数	 | 	29	 | 	236	 |

### F - Simultaneous Swap

- [問題はこちら](https://atcoder.jp/contests/abc296/tasks/abc296_f)

| 		 | 	Python (3.8.2)	 | 	PyPy3 (7.3.0)	 |
| 	:--	 | 	--:	 | 	--:	 |
| 	中央値(ms)	 | 	634.5	 | 	384	 |
| 	平均値(ms)	 | 	917.33	 | 	479.78	 |
| 	最大値(ms)	 | 	1731	 | 	1632	 |
| 	最小値(ms)	 | 	379	 | 	169	 |
| 	提出数	 | 	6	 | 	80	 |


## 最後に

予想通りではありますが、実行速度は処理によるため、なんとも言いづらい結果となりました。
単純に今回の比較だけで判断するならば、問題が難しくなるほどにPyPyが速度面で優秀なため、ひとまずPyPyを選んでおけば無難であるとは言えますでしょうか。書き方によってはPythonでも実行時間制限を余裕で下回るという言い方もできますでしょうか。
言語の差よりも書き方の差の方が大きいと言える結果ではあります。

そのうち全プログラミング言語を対象とした速度調査もやってみたいと考えています。

## 宣伝

[SupershipのQiita Organization](https://qiita.com/organizations/supership-inc)を合わせてご覧いただけますと嬉しいです。他のメンバーの記事も多数あります。

Supershipではプロダクト開発やサービス開発に関わる方を絶賛募集しております。
興味がある方は[Supership株式会社 採用サイト](https://supership.jp/recruit/)よりご確認ください。