note.nkmk.me

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

Posted: 2019-09-19 / Modified: 2020-06-27 / Tags: Python, NumPy, SciPy

2020年5月時点でAtCoderで使用できるPythonおよびNumPy, SciPyなどのライブラリのバージョンとその注意点について以下の内容を説明する。

  • 言語アップデート前後でのバージョン
    • 2020年4月12日(ABC162)以降のコンテスト
    • 2020年4月4日(ABC161)以前のコンテスト
  • バージョンを確認するコード
  • アップデート前のバージョン(Python3.4.3)での注意点
    • Pythonの注意点
      • 最大公約数gcd()mathではなくfractionsモジュール
      • f文字列は使えない
    • NumPyの注意点
      • 最大公約数numpy.gcd(), 最小公倍数numpy.lcm()は使えない
    • SciPyの注意点
      • 順列の総数scipy.special.perm()は使えない
      • 組み合わせの総数scipy.misc.comb()は使える
      • 最小全域木scipy.sparse.csgraph.minimum_spanning_tree()は使える
      • 連結成分scipy.sparse.csgraph.connected_components()は使える
      • 最短経路scipy.sparse.csgraph.shortest_path()は使える
スポンサーリンク

言語アップデート前後でのバージョン

2020年4月12日(ABC162)以降のコンテスト

言語アップデートが行われた2020年4月12日(AtCoder Beginner Contest 162)以降のコンテストでは以下のバージョンとなっている。

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

なお、2020年6月18日に過去問の言語もアップデートされた。新たに提出する場合はPython3.8.2となり、Python3.4.3は選択できない。

それ以前に提出済みのコードはPython3.4.3のものなので、そのままコピペするとPython3.8.2では不正解となる可能性がある。後述のアップデート前のバージョンでの注意点を参照。

バージョンを確認するコード

以下のコードを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におけるPython3のバージョンは3.4.3。公式ドキュメントは以下。

最大公約数gcd()はmathではなくfractionsモジュール

Python3.5以降は最大公約数を算出するgcd()関数がmathモジュールにあるが、それより前はfractionsモジュールにあった。

言語アップデート前のAtCoderはPython3.4.3なのでfractionsモジュール。

f文字列は使えない

そもそもAtCoderの問題でf文字列(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()などの詳細は以下の記事を参照。

スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事