AtCoderのPython, NumPy, SciPyのバージョンと注意点(2023年10月)

Modified: | Tags: Python, NumPy, SciPy

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

そのほか、多数のライブラリが追加された。

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モジュール。

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では使えない。

SciPyの注意点

言語アップデート前のAtCoderにおけるSciPyのバージョンは0.13.3

以下は0.13.0の公式ドキュメント。0.13.3までのアップデートはバグフィックスのみで機能追加はなし。

なお、SciPyのサブパッケージscipy.xxximport 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では使えない。

組み合わせの総数scipy.misc.comb()は使える

組み合わせの総数を返すscipy.special.comb()もバージョン0.14.0で追加された関数だが、それより前のバージョンではscipy.misc.comb()として使える。

SciPy0.13.3ではscipy.misc.comb()が使える。scipy.misc.comb()では引数repetitionが使えないので注意。

最小全域木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()などの詳細は以下の記事を参照。

関連カテゴリー

関連記事