トップ画像
競プロ環境構築#3 Python編

執筆者: 終に鮭

最終更新: 2021/11/15

Windowsの方はWSLを入れて読んでください。

Pythonはいいぞ。Pythonはクソ。私がPythonを始めようとしているすべての人(上級者とか逸般人とか言われる人を除く)に言っていることです。
Pythonをやりましょう。
プログラミング初心者が一番最初に触るのに適している言語はPython…そんなわけ無いですね。JavaScriptだと思います(個人の感想です)。
JavaScriptについては別の回でやります。
まあPython人気ですし。やりましょう。

Googleトレンド「プログラミング言語」関連トピックの人気順5位がPython

図1:Googleトレンド「プログラミング言語」関連トピックの人気順5位がPython(2021年6月28日現在)←執筆をサボってたのがバレちゃう!


Pythonが初心者向けである理由

ググれ。というのもなんなのでちょっとぐらい僕の見解を話します。

動的型付け言語である

言語の特性の話ですが、型を意識してプログラムを書くというのは知識なしでは難しいと思います。
単にモノを作りたい、というだけであれば別に静的型付けに拘る必要はないですし、余計な難点が取り払われると考えることができます。
本物の初心者はエラーログを読めないことが多い[独自研究]のでそっちのほうが楽です。

実はそんなに新しくない

Pythonはここ数年で[いつ?]急速に流行りだした言語ではありますが、Python 2.0(廃止済み)が2000年に、Python 3.0が2008年にリリースされています。
…いや言うて新しいやん、Go,Rust,Kotlinあたりと同じぐらいの時期やん、と思われるかもしれません。 が、それは言語としての話であって処理系としての話でいうとPython 3がだいぶ早いです。Go 1は2012年3月28日、Rust 1.0.0は2015年5月16日、Kotlin 1.0.0は2016年2月15日です。 対してCPython v3.0は2008年12月4日です。 まあ大幅な仕様変更が有ったとは言え、随分前からv2.xの処理系は有ったわけですから当然っちゃ当然ですね。
余談ですが、今は見る影もないCPython v1.0.1は1994年2月16日にリリースされました。Gitが生まれたのが2005年といえば相当昔なのがわかると思います。
利用者が多いという点も、情報が多いことに寄与していると思われます。 公式リファレンスも充実しています(もっとも、競プロだから公式リファレンスと多少のモジュールだけ見てれば十分という話ですが)。

競プロにおいてPythonが微妙な点

遅い

最大の欠点と言っても過言ではない。そう、このCPythonというインタプリタは普通に使うと遅いです。 それはもうとにかく遅い。


上記tweetの一番右が多分CPython 3だと思いますが、AC者滅茶苦茶少ないですよね。なぜかと言えば普通に書くと遅いから。
Python 3自体の使用者はかなり多いのですが(C++に次いで2番目[要出典])、 ユーザーの大半はPyPyというCPythonとは別のインタプリタを使っています。 CPythonで動くコードをほとんどそのまんま動かせて、しかも早いのが素晴らしいところです。 AtCoderで未だにPyPy 7.3.0(Python 3.6)が使われているのが玉に瑕ですが、次の言語アップデートを気長に待ちましょう。

Off-side Rule

サッカーの話ではなくて。ここでは、左端から離れる(off-side)規則のことです。インデントでブロックを表します。 対になる概念はCurly-bracket programming(中括弧でブロックを表す)。
Pythonという言語の設計思想は調べてもイマイチわかりませんが、 一つ言えそうなことは「プログラムが動くためには、美しく有るべき(SHOULD)。」ということです。動いてはならない(MUST NOT)、まで強くはないです。
ついでに、現在のPythonの言語仕様は PEP(Python Enhancement Proposal; Pythonをよりよくする提案)という提案を多数取り込むことで出来上がっています。 マージされたPEPの中でも最も有名なのはPEP8でしょう。 Pythonの生みの親であるGuido van Rossumを含む3人によって提案された、コードスタイルについての規則です。 その中では、インデントの推奨サイズ(半角スペース4個、2個でも8個でも、タブスペースでもない)や1行の推奨最大文字数まで指定されています。
それで、それの何が問題かと言えば、コードをコピペしたときにインデントが崩れたとして、それを自動で直すことができません。 コピペライブラリを貼り付ける場合にわざわざインデントを手動で直さなければならず、不便きわまりありません。 中括弧を使わなくともブロック末尾にendキーワードを置くRubyでは問題にならないのですが……

本編

お待たせしました。環境構築について話していきます。
例によって、#1 共通編を前提としますが、 使っているHeadless CMSサービスの都合上、<details> <summary>要素とかidによるページ内リンクが使えずごちゃごちゃしているので、 そのうち大幅改版してDockerfileでも作ることにします。乞うご期待。
正規表現でうまいこと置換すれば任意のHTML要素を置けるとかそういうことを言わない。
さて、Pythonの環境についてですが、一応CPythonとPyPy両方の説明をします。 速度的にはPyPyのほうが手抜きして高速化できるのですが、AtCoderのPyPyではNumPy等の便利なライブラリが使用できません。 CPythonで使えるライブラリはここのQiita記事に書いてありましたが、実際使えそうなのはNumPy、Numba、NetworkXぐらいでしょうか。SciPyも使える時があるのかな。 私は標準ライブラリしか使わないので基本PyPyです。

PyPy

UbuntuでPyPy3をインストールする方法は複数あります。

  1. aptを利用してUbuntu公式リポジトリのpypy3/focal 7.3.1+dfsg-4をインストールする
  2. 公式で配布されているPyPy3 7.3.0のビルドをダウンロードする
  3. pypy.orgからPyPy3 7.3.0のソースをダウンロードしてビルドする

手っ取り早い1と2の方法を紹介します(PyPyは公式でも自分でビルドすることは推奨されていないので)。

方法1 apt install

説明するまでもないような気がしますが。

$ sudo apt install pypy3
$ pypy3 -V

はい。

方法2 ビルド済みのPyPyをダウンロード

これもtarをダウンロードしてきて展開して適切な場所に配置するだけです。簡単ですね。

$ sudo apt install wget
$ cd /tmp
$ wget https://downloads.python.org/pypy/pypy3.6-v7.3.0-linux64.tar.bz2
$ sudo tar vxjf pypy3.6-v7.3.0-linux64.tar.bz2 -C /usr/local/lib
$ cd /usr/local/bin
$ sudo ln -s ../lib/pypy3.6-v7.3.0-linux64/bin/pypy3 pypy3
$ pypy3 -V

CPython

AtCoderで2021年11月現在採用されているCPythonのバージョンは3.8.2です。

  1. aptを利用してUbuntu公式リポジトリのpython3/focal,now 3.8.2-0ubuntu2をインストールする
  2. python.orgからPython 3.8.2のソースをダウンロードしてビルドする

とまあPyPyと概ね同じですが、Linux向けビルド済みパッケージを公式が配布していないので、 Ubuntuからの供給が絶たれれば自分でビルドする他なくなります。

方法1 apt install

$ sudo apt install python3
$ python3 -V

はい。

方法2 ソースからビルドする

時間がかかるのであんまりしたくありませんが、一応。

$ cd /tmp
$ sudo apt install wget xz-utils gcc make zlib1g-dev libssl-dev libbz2-dev libffi-dev
$ wget https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tar.xz
$ tar vxJf Python-3.8.2.tar.xz
$ ./configure --prefix="$HOME/.local"
$ make
$ make test
$ sudo make install
$ echo "PATH=$HOME/.local/bin:\$PATH" > ~/.bashrc && source ~/.bashrc
$ python3 -V

ライブラリのインストール

CPythonはいくつかライブラリが入っているという話をしたので、一応入れておきましょう。

$ pip3 install networkx numba numpy scipy

何も考えることはないですね。
こちらとしてはインストールに難儀しました。
./configure時に--prefixオプションを指定しないと、make install時に/usr/local/binに書き込もうとするので権限がなく、sudo make installするとpip installがrootでしか使えませんでした。
また、libssl-devを入れないとそもそもpip installできないし、libbz2-devがないとNetworkXが、libffi-devがないとがNumbaとSciPyが使えませんでした。
これでお好きなようにPythonのコードを書くことができます。

VSCodeの拡張機能

  • Python
  • Pylance
  • python-snippets
  • Visual Studio IntelliCode

あたりを入れとけばいいんじゃないですかね。知らんけど。

取得に失敗しました

2020年度 入部

Twitter GitHub YouTube