Warning: First parameter must either be an object or the name of an existing class in /home/prompt/unidayo.com/public_html/wp-content/themes/cocoon-master/lib/shortcodes-amazon.php on line 155
AtCoderは数十種類のプログラミング言語に対応しています。もちろん、言語によって長所・短所があります。
趣味や仕事で使っていて慣れている言語がある人は、とりあえずその言語で遊んで雰囲気をつかんでみるのがおすすめです。
しかし、「プログラミングは全くやったことがない」とか「講義で少し触ったくらい」という方は、どの言語を使えばいいかわからないと思います。
そこで、この記事ではAtCoderの言語二大派閥の
- C++
- Python
を比較し、なぜ初心者はPythonを選ぶべきかの説明をしています。
なお、筆者のうにだよはAtCoderではPython(PyPy)をメインでしている、レート1602の青コーダーです。(2020年11月現在)
はじめに
『Python』と『C++』が二大派閥
Atcoderの言語の提出数は、1位『C++』6割、2位『Python(PyPy含む)』2割弱、3位『Java』5%といったところです。『C++』か『Python』のどちらかを使っている人が大多数です。
調べてみると『C++』がおすすめという意見が多いと思います。さらに、AtCoderの公式チュートリアルはC++です。
結論:初心者はPythonにしよう
ここで、いきなり私の結論を書きます。
「初心者はPythonを選んだほうがほぼあらゆる面で有利で、挫折せずに続けやすいです。Pythonを使うことをおすすめします。」
理由は以下の通りです。
- 情報量はPythonでも十分
- Pythonは学習コストが低く、競プロを楽しめるようになるまでの準備段階が短い
- 書きやすいため、とくに初心者帯では早解きで順位やパフォーマンスを伸ばしやすい
- 機能・ライブラリはPythonも十分で、そのうえ使いやすい
- 初心者のうちは、C++の処理速度が高速であることの恩恵はない
『Python』VS『C++』
言語を決めるうえで着目すべきポイントは、次の5つです。
- 競プロで使っている人の人口(≒情報量)
- 文法や仕様の覚えやすさ
- 書きやすさ(≒コードを書くのにかかる時間)
- 機能・ライブラリの豊富さ
- 処理の速さ
人口
人口はC++が一番多く、Pythonが次点です。この2言語の情報は充実しています。
以前はPythonの情報が少なかったようですが、今(2020年11月)はそうではありません。たとえば宣伝ですが、私もBeginner ContestのA,B,C問題のPython解説記事を書いていたりします。
ただし、まだPythonで橙(R2400~2799)になった人があまり多くなく、赤はたぶん1人だけしかいないので、非常に高レベルな情報はC++のものがほとんどな気がします。(よく知りませんが……)
判定:引き分け
- 初心者のうちは、C++, Pythonともに情報はいくらでも手に入ります
余裕がでてきたら、C++を読めるようにはしておくと得られる情報が増えて良いかもしれません。
文法・仕様の覚えやすさ
Pythonのほうが覚えやすいです。プログラミング言語の中でも、比較的習得しやすいほうだと言われています。
C++は一般的には大変難易度の高い言語だと言われていますが、競技プログラミングで使うだけならば他の言語と比べてとくに難しいわけではありません。それでもPythonよりはだいぶ難しいですし、知らないとハマる罠も多いです。
Pythonの勝ち
- Pythonは簡単なので、競プロの問題そのものの練習に集中しやすいので、競プロの上達も速くなる
- C++は学習コストが高いため、競プロをはじめるまでの道のりが長くなりがち
- C++は慣れるまでが長く、それまでは問題の本質と関係ない文法・仕様の部分でミスをしやすく、ストレスになりうる
書きやすさ
Pythonはとても簡潔で書きやすいです。英語のように書けると言われています。
C++でも、上級者になれば大差ない時間で書けそうですが、慣れないうちはかなり問題を解くスピードが違います。
Pythonの勝ち
- コードを速く書き終わることができるのはつまり、問題を速く解けるということです
- コンテストなら順位・パフォーマンスが上がります(とくに初心者帯のうちは、5分の差でパフォーマンスが100とか200変わることもたまにあります)
- 普段の過去問練習でも、同じ時間でより多くの問題を解けて効率的です
機能・ライブラリの豊富さ
C++のほうが豊富ですが、Pythonも標準機能に必要なものがほぼ揃っています。
C++はライブラリの使い方が難しいものが多く、学習コストがやや高いです。一方、Pythonは直感的に使えるものが多いです。
AtCoderLibrary(ACL)というAtCoder公式のC++ライブラリが最近導入され、問題を解くときに使えるようになりました。しかし、内容のほとんどは中上級者向けで、青(R1600~)くらいまでは使う場面は多くありません。
一部、茶~水(R400~1599)レベルでも使うもの(例: UnionFind木、Binary Indexed Treeなど)がありますが、そのレベルのものはネット上にいくらでもコードが転がっているので、それを使えばいいです。
初心者帯:Pythonの勝ち、中級者以上:C++の勝ち
C++
- C++のほうが充実はしている
- しかし、使い方を覚えるのが面倒
- AtCoder Libraryも、中上級者以上の人にとっては魅力的
Python
- 初心者が使うライブラリは十分に揃っていて、困ることはない
- かなり使いやすい
- 一部C++の標準にあってPythonにないものはある(例:std::set・順序付き集合)
処理の速さ
C++は処理速度が非常に高速な言語です。現実の開発でも、処理速度が重要な場面で使われることが多いです。
一方、Pythonはかなり低速な言語です。おおよそ、C++と比べて処理時間に10倍くらいの差があります。
AtCoderは決められた制限時間内に計算が終わらないと、TLE(Time Limit Exceed、実行時間制限超過)で不正解にされます。この点では、低速なPythonは不利です。
ただし、10倍の速度差はそこまで大きな差ではありません。同じ正解を出せるコードであっても、答えを計算する方法(アルゴリズム)によって、1,000倍や10,000倍、場合によっては1,000,000倍以上計算時間が変わるからです。
基本的には、C++で正解になる方法はPythonでも正解になりますし、PythonでTLEになる低速な方法はC++でもTLEになります。
重要事項1:言語アップデートでPythonが速くなった
2020年4月ごろに、AtCoderの判定システム上で動くプログラミング言語のバージョンがアップデートされました。これにより、多くの言語の処理速度が改善されました。
アップデート以前は、Pythonで解くのが厳しい問題もかなりありましたが、今ではそのような問題は少なくなっています。
重要事項2:PyPyを使おう
言語アップデートで高速になったといえ、通常のPythonでは実行時間がやや厳しい時間はたまにあります。そこで、Pythonのコードほぼそのままで高速化の恩恵を得られる”PyPy”を使うことをおすすめします。
Pythonには”実装”のバリエーションがいくつかあります。そのうち、AtCoderで使えるものは以下の3つです。
Python: 最も一般的なPython(内部がC言語で実装されたPythonなので、CPythonと呼ばれます)
PyPy: 実行時コンパイル(JITコンパイル)という方法で、Pythonのコードそのままでそこそこ高速で実行できるようにしたPython
Cython: C言語の関数や変数の型を使えるようになっており、うまく利用できれば、C言語に近い速度で処理できるよう拡張されたPython
Cythonが最も高速化の効果が大きいですが、使い方が難しいです。
もう1つのPyPyは、Pythonのコードそのままでそれなりの高速化を得られます。PyPyを使えば、緑コーダーまで(R~1199)の人が解くレベルの問題で困ることはないと言って差し支えありません。(※私は緑コーダーまでの人が解くレベルの問題を、PyPyを使ってほぼ全て解いたのでこう言えます)
初心者:引き分け 中級者以上:C++の勝ち
初心者が解く問題では、実行時間がシビアな問題は出ないといっていいです。正しいアルゴリズムを使えば、何使っても通ります。(Pythonユーザーは2番目に多いので、初心者向けの問題はPythonかPyPyで余裕を持って通せるよう配慮されているような気もします)
中級者以上の問題であっても、基本的にはPyPyで解けますが、少し非効率なことをするとTLEになる問題もたまにあります。
まとめ「初心者はPython(PyPy)を選べ!」
人口:引き分け
文法・仕様の覚えやすさ:Python
書きやすさ:Python
機能・ライブラリの豊富さ:初心者→Pythonの勝ち、中級者以上→C++の勝ち
処理の速さ:初心者→引き分け、中級者以上→C++の勝ち
これらから導き出せるPythonのメリットを箇条書きにしてまとめると、以下のとおりです。(記事冒頭と同じです)
- 情報量はPythonでも十分
- Pythonは学習コストが低く、競プロを楽しめるようになるまでの準備段階が短い
- 書きやすいため、とくに初心者帯では早解きで順位やパフォーマンスを伸ばしやすい
- 機能・ライブラリはPythonも十分で、そのうえ使いやすい
- 初心者のうちは、C++の処理速度が高速であることの恩恵はない
このように、初心者はPythonを選んだほうがほぼあらゆる面で有利なので、Pythonを使うことをおすすめします。
だんだんC+が有利になるが、後から覚えれば良い
とはいえ、問題が難しくなるほどC++が有利になります。Pythonで赤コーダーに到達した人がいる以上、赤になるのも不可能ではありませんが、C++のほうが楽な気がします。
ですので、「Pythonではじめると、後々不利になるのではないか?」と思う方もいるかもしれません。
しかし、以下の3つの理由より、それはあまり気にしなくて良いと思います。
- 必要になってからC++に乗り換えても良い
- 普段はPythonを使って、C++が必要な問題だけでC++を使うこともできる
- そもそも、Pythonが不利になるほどのレートに到達できる人はあまり多くない
あとからC++を覚える場合は、Pythonでプログラミングの基礎的な概念・コードの動きを追う地力が育まれているはずです。いきなりC++を覚え始めるよりも、かなり簡単にC++を覚えられると思います。
その他のポイント
選ぶ理由にはならない程度の、その他のポイントです。
- C++はAtCoder公式のチュートリアルがある
- Pythonは競プロ外でも使いやすい
C++はAtCoder公式のチュートリアルがある
C++にはAtCoder公式のチュートリアルがあります。質は高いと思います。
しかし、本1冊を買いたくないためだけにC++を使うのはやめたほうがいいと思います。
Pythonの初心者向けの本を1冊だけ買うか、progate(無料部分だけでは不足)的なものをやれば十分です。
内容としては、リスト(配列)が使えて、if文・for文・関数が書ければ、AtCoder Beginner Contest(ABC)のB問題を解くための土台としては十分です。あとはAtCoderをやりながら、必要なことを覚えていけばいいです。
Pythonは競プロ外でも使いやすい
少し追加で学習する必要はありますが、Pythonを使うとさまざまなことが比較的簡単に実現できます。たとえば、簡単な事務作業の効率化などができます。
Djangoなどのフレームワークでアプリを作ることもできますが、Python以外のことをかなり幅広く学習する必要はあります。
一方、C++は『競プロで使える』と『実用できる』の間にかなり大きな差があります。競プロ外で使うにはさらに多くのことを学ぶ必要があり、大変です。
競プロのために使う言語なので、競プロ以外のことを考慮すべきかは個人の考え次第です。ですが、選ぶ理由にはなりえると思います。