AtCoderのPython, NumPy, SciPyのバージョンと注意点(2023年10月)
2023年10月時点でAtCoderで使用できるPythonおよびNumPy, SciPyなどのライブラリのバージョンとその注意点について説明する。
AtCoderで使用できるPythonおよびライブラリのバージョン
2023年8月12日(ABC314)以降
言語アップデートが行われた2023年8月12日(AtCoder Beginner Contest 314)以降は以下のバージョンとなっている。
Python: 3.11.4
NumPy: 1.24.1
SciPy: 1.10.1
scikit-learn: 1.2.0
Numba: 0.57.0
NetworkX: 3.0
そのほか、多数のライブラリが追加された。
- img.atcoder.jp/file/language-update/language-list.html
- AtCoder 2023/1 Language Update - Google スプレッドシート
numpy==1.24.1
scipy==1.10.1
networkx==3.0
sympy==1.11.1
sortedcontainers==2.4.0
more-itertools==9.0.0
shapely==2.0.0
bitarray==2.6.2
PuLP==2.7.0
mpmath==1.2.1
pandas==1.5.2
z3-solver==4.12.1.0
scikit-learn==1.2.0
ortools==9.5.2237
ac-library-python
setuptools==66.0.0
cppyy==2.4.1
torch==1.13.1
polars==0.15.15
lightgbm==3.3.1
gmpy2==2.1.5
numba==0.57.0
2020年4月12日(ABC162)以降
2020年4月12日(AtCoder Beginner Contest 162)以降、2023年8月12日(AtCoder Beginner Contest 314)までは以下のバージョンだった。
Python: 3.8.2
NumPy: 1.18.2
SciPy: 1.4.1
scikit-learn: 0.22.2.post1
Numba: 0.48.0
NetworkX: 2.4
2020年4月時点での最新バージョンになったのに加え、scikit-learn, Numba, NetworkXが新たに使用できるようになった。
2020年4月4日(ABC161)以前
2020年4月4日(AtCoder Beginner Contest 161)以前は以下のバージョンだった。
Python: 3.4.3
NumPy: 1.8.2
SciPy: 0.13.3
バージョンを確認するコード
以下のコードをAtCoderの各コンテストのコードテストで実行すると、Python本体およびNumPy, SciPyなどのライブラリのバージョンが確認できる。
import platform
import numpy
import scipy
print('Python: ', platform.python_version())
print('NumPy: ', numpy.__version__)
print('SciPy: ', scipy.__version__)
try:
import sklearn
import numba
import networkx
print('scikit-learn: ', sklearn.__version__)
print('Numba: ', numba.__version__)
print('NetworkX: ', networkx.__version__)
except:
pass
結果は上述の通り。
Python本体やNumPyはさらに詳細な情報を取得することも可能。
言語アップデート前のコンテストではscikit-learnなどがインポートできずエラーになるので例外処理をしている。
旧バージョン(Python3.4.3)での注意点
ここからは旧バージョン(Python3.4.3)での注意点を示す。新たに提出する場合は特に気にする必要はないが、Python3.4.3で提出済みの古いコードを参考にする場合などに参照されたい。
あくまでも、ある関数などが使える・使えないという情報であり、それを使ったほうがいいというわけではない。扱うデータのサイズなどの条件によっては自分で実装するなど他の手段のほうが実行時間やメモリ使用量が有利な場合もある。
また、すべての注意点を網羅しているわけではなく、同じ関数でもバージョンによって挙動が異なる場合もある。詳細は各項の冒頭に記載した該当バージョンの公式ドキュメントを参照されたい。
Pythonの注意点
言語アップデート前のAtCoderにおけるPythonのバージョンは3.4.3
。公式ドキュメントは以下。
最大公約数gcd()はmathではなくfractionsモジュール
Python3.5
以降は最大公約数を算出するgcd()
関数がmath
モジュールにあるが、それより前はfractions
モジュールにあった。
言語アップデート前のAtCoderはPython3.4.3
なのでfractions
モジュール。
- 関連記事: Pythonで最大公約数と最小公倍数を算出・取得
f文字列は使えない
f文字列はPython3.6
で追加された機能なので言語アップデート前(Python3.4.3
)では使えない。
書式指定をしたいときはformat()
などを使う。
NumPyの注意点
言語アップデート前のAtCoderにおけるNumPyのバージョンは1.8.2
。
以下は1.8.1
の公式ドキュメント。1.8.2
でのアップデートはバグフィックスのみで機能追加はなし。
最大公約数numpy.gcd(), 最小公倍数numpy.lcm()は使えない
最大公約数を算出するnumpy.gcd()
, 最小公倍数を算出するnumpy.lcm()
が追加されたのはNumPy1.15.0
。NumPy1.8.2
では使えない。
- 関連記事: NumPyで最大公約数・最小公倍数を算出・取得
SciPyの注意点
言語アップデート前のAtCoderにおけるSciPyのバージョンは0.13.3
。
以下は0.13.0
の公式ドキュメント。0.13.3
までのアップデートはバグフィックスのみで機能追加はなし。
- SciPy — SciPy v0.13.0 Reference Guide
- Release v0.13.3 · scipy/scipy
- scipy/doc/release at v0.13.3 · scipy/scipy
なお、SciPyのサブパッケージscipy.xxx
はimport scipy
だけだと読み込まれないので注意。
例えばimport scipy
のあとでscipy.misc.comb()
を実行するとエラーになる。
from scipy.xxx import 関数名
として関数名()
を実行するか、import scipy.xxx
としてscipy.xxx.関数名()
を実行する必要がある。
順列の総数scipy.special.perm()は使えない
順列の総数を返すscipy.special.perm()
はバージョン0.14.0
で追加された。SciPy0.13.3
では使えない。
- 関連記事: Pythonで階乗、順列・組み合わせを計算、生成
組み合わせの総数scipy.misc.comb()は使える
組み合わせの総数を返すscipy.special.comb()
もバージョン0.14.0
で追加された関数だが、それより前のバージョンではscipy.misc.comb()
として使える。
SciPy0.13.3
ではscipy.misc.comb()
が使える。scipy.misc.comb()
では引数repetition
が使えないので注意。
- 関連記事: Pythonで階乗、順列・組み合わせを計算、生成
最小全域木scipy.sparse.csgraph.minimum_spanning_tree()は使える
グラフの最小全域木を返すscipy.sparse.csgraph.minimum_spanning_tree()
はバージョン0.11.0
で追加された関数。SciPy0.13.3
でも使える。
連結成分scipy.sparse.csgraph.connected_components()は使える
グラフの連結成分の個数などを返すscipy.sparse.csgraph.connected_components()
もバージョン0.11.0
で追加された関数。SciPy0.13.3
でも使える。
最短経路scipy.sparse.csgraph.shortest_path()は使える
グラフの最短経路を返すscipy.sparse.csgraph.shortest_path()
もバージョン0.11.0
で追加された関数。SciPy0.13.3
でも使える。
ただし、バージョン0.13.3
時点のscipy.sparse.csgraph.shortest_path()
には引数indices
が無いため、常にすべての頂点間の最短経路が算出される。
ダイクストラ法scipy.sparse.csgraph.dijkstra()
やベルマンフォード法scipy.sparse.csgraph.bellman_ford()
といった各アルゴリズムの関数では引数indices
を指定可能。
scipy.sparse.csgraph.shortest_path()
やscipy.sparse.csgraph.dijkstra()
などの詳細は以下の記事を参照。