競技プログラミング

pythonが競プロにおススメな理由

たびすけ
今から競技プログラミングをはじめるならpythonがおススメです。

AtCoderでの言語別提出数

AtCoderでの言語別提出数を2020年1月現在のデータで作成してみました。

取得方法

データの取得にはAtCder非公式APIを使いました。

取得コード

コードはこんな感じで、CSV出力です。

import requests
import collections
import csv


contest_url = "https://kenkoooo.com/atcoder/resources/lang.json"
res = requests.get(contest_url)
d = collections.defaultdict(int)

for j in res.json():
    d[j["language"]] += j["count"]

with open("language_cnt.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(sorted(d.items(), key=lambda x: x[1], reverse=True))
    f.close()

取得結果のグラフ

取得結果をグラフにすると次のような感じになっています。

グラフを見るとC++が\(37.8\%\)で一位ですが、pyhonの\(19.7\%\)とpypyの\(8.8\%\)を合わせると\(28.5\%\)となっています。

こちらが2019年1月現在のデータなのでちょうど\(1\)年位前のデータになっているので、ここ1年でpythonpypy提出割合がC++に迫っていることが分かります。

このAPIのデータは全期間分なので、恐らくここ\(1\)年だけならpythonpypyの勢いスゲーな状況になっていると思われます。

問題に対する提出数なので、いったんpythonで提出しても使用感が悪ければ違う言語で提出すると思いますのでpythonは競技プログラマーにとって使用感が良い言語であることがデータから分かります。

提出数が多いということはやサンプルコードも多いということになり、サンプルコードや解説記事の多さは勉強する際に重要です。

一昔前は「競プロならC++一択」でしたが、現在はpythonも競技プログラミングで人気の言語になっています。

たびすけ
マイナー言語だと解説記事などが見つからないので、他の言語もある程度は読めないとキツイです!

pythonのメリット

なぜpythonが競技プログラミングで人気なのでしょうか?

pythonのメリット

  • 学習コストが低い
  • コードが読みやすい
  • 競プロに有利な標準ライブラリ
  • 競プロ以外でも人気

学習コストが低い

コードが読みやすいと重複する部分もありますが、競技プログラミングをはじめるだけ(A~C問題)なら(私はJavaを使っていましたが)\(1\)日である程度は解けるようになります。

普段プログラムを書いている人が競技プログラミングをはじめる時の一番の壁が標準入力になりがちですが、pythonは圧倒的に標準入力が簡単です(Javaで標準入力を実装するのが面倒だからpythonを選択しても良いくらい楽ですw)し、頻出のListforの扱いが楽です。

難しい問題を解くにはそれなりの勉強が必要になってきますが、「とりあえず競プロやってみる」という人にはpythonは本当におススメできる言語です。

コードが読みやすい

めちゃくちゃコードが読みやすいです。

他の言語のサンプルコードと比較すると、コードによっては行数が\(\displaystyle \frac{1}{3}\)ということはザラにあります。

当然コードが短い方が読みやすいです。

コードの設計にインデントが定義されていることもコードが読みやすい理由です。

コードの実装方針が同じなら本当に誰が書いても似たようなコードになってくるのは神です。

競プロに有利なライブラリ

pythonのライブラリ

  • math
  • itertools
  • collection
  • bisect
  • heapq
  • numpy
  • scipy

すぐに思いつくだけでも、競プロに使えるライブラリがこれだけ挙げられます。

これらのライブラリを上手く使えればABCレベルの問題を楽しむには十分です。(もちろんアルゴリズムの勉強は必要です。)

例えばitertoolsなどをJavaC#では自分で実装しなければならず、(もちろんあらかじめライブラリとして用意すれば問題ないですが、ライブラリを用意し始めるのはC問題をある程度解けるようになってからだと思っています)初心者にはハードルが高いですが、pythonならimport itertoolsの一文で解決できます。

競プロ以外でも人気

学校の授業で触れた、機械学習関連のライブラリが豊富、学習コストが低い、コードが読みやすい等の理由でpythonは人気です。

新入社員が「pythonならできます!!!」ってことも最近は多いくらいに人気です。

pypyを使えば結構早い

pypyは事前にコンパイルすることでpythonと同じコードで実行速度が速いのが特徴です。

それでもC++等と比較すると遅いですが、競プロを楽しむには十分な速度です。

競プロで世界を目指すならC++を選んで下さい。

pythonのデメリット

以前に比べてデメリットも減ってきています。

競プロ実力者が少ない

pythonは新しい言語なので、古参の実力はC++を使っているというのは否定できません。

競プロで世界を目指すというレベルの人はおとなしくC++でもいいかもしれません。

ただ、最近はpythonでも強者が多くなってきているので言語の問題というよりは競プロ歴の問題のような気がします。

今後はpythonの競プロ強者が増えていくと予想されます。

実際に、ネット上の解説・サンプルコードもpythonが多くなってきている印象です。

実行速度がC++に比べて遅め

これはもう超えられない壁なので諦めましょう。

実際に、C++JavaC#を使う友人がpythonで同じ実装しても実行時間オーバーしてしまうようなコードでACして悔しい思いをしたことがありますが、正しく実装すればpythonでも解けるので自分の勉強不足に気づかされたと前向きにとらえられました。

むしろpytonで正しい・工夫した実装をするために悩んだ問題は印象に残って自分の力になっていることの方が多いです。

一般企業のアルゴリズム力のカンストであると言われる青コーダーレベルならpythonで到達可能ということを実力者が証明しています。

とりあえず、青コード位まではpythonで到達して、それ以上を目指す時にC++に乗り換えるか考えてみれば良いと思います。

競プロで世界を目指すというレベルの人はおとなしくC++でもいいかもしれません。

たびすけ
pythonにもメリット・デメリットがありますが、競プロに関してはメリットの方が多いです!
現時点で将来性もある言語なので迷っていたらとりあえずpythonを選択しておけば間違いはないです!

プログラミング

-競技プログラミング