SlideShare a Scribd company logo
Copyright(C) Nowcast, Inc. All rights reserved.
Nowcast
Pythonで競プロをしよう!
〜入門者が知っておくべき高速化Tips〜
2020年8月28日
株式会社ナウキャスト
大野 巧作
PyCon JP 2020
#pyconjp_4
Copyright(C) Nowcast, Inc. All rights reserved. 2
● 自己紹介
● 標準入力
● 基本的なデータ構造の計算量
● Listの効率的な使い方
● Sort関連
● PythonとPyPy
アジェンダ
Copyright(C) Nowcast, Inc. All rights reserved. 3
● 名前:大野巧作
● 所属:株式会社ナウキャスト
○ データサイエンティスト・データエンジニア
● Python歴:3年
● 好きな標準ライブラリ:itertools
● AtCoderアカウント:Kevinrobot34
自己紹介
Copyright(C) Nowcast, Inc. All rights reserved. 4
● 名前:大野巧作
● 所属:株式会社ナウキャスト
○ データサイエンティスト・データエンジニア
● Python歴:3年
● 好きな標準ライブラリ:itertools
● AtCoderアカウント:Kevinrobot34
自己紹介
Copyright(C) Nowcast, Inc. All rights reserved.
競プロでは実行速度の早いC++がメジャーですが、近年Pythonでの参加者も増えています。
Pythonは書きやすさが人気の一つですが、やはり実行速度はC++に比べると遅いです。
このセッションではPythonで競プロをする際に、知っておくとそれだけで実行時間を短く
できたりするようなテクニックを紹介していきます!
紹介すること
■ Pythonで競プロをする上で気をつけた方が良い書き方
■ PyPyを用いた高速化
紹介しないこと
■ numpyやnumbaを用いた高速化
Overview
5
Copyright(C) Nowcast, Inc. All rights reserved.
■ 個人のMacBookProを利用して実験
■ 基本的にはPythonのtimeitを使って10回繰り返し実行し、計測時間を観察した
■ 一部shellのtimeコマンドも利用
■ AtCoderへの提出した際の実行時間のことも
時間の計測方法について
6
Copyright(C) Nowcast, Inc. All rights reserved.
標準入力
7
Copyright(C) Nowcast, Inc. All rights reserved.
組み込み関数のinput()はかなり遅い!
標準入力
inputとsys.stdin.readline
n = int(input())
a = [int(input()) for _ in range(n)]
import sys
input = sys.stdin.readline
n = int(input())
a = [int(input()) for _ in range(n)]
8
1000000
1
2
3
4
...
Copyright(C) Nowcast, Inc. All rights reserved.
組み込み関数のinput()はかなり遅い!
標準入力
inputとsys.stdin.readline
n = int(input())
a = [int(input()) for _ in range(n)]
import sys
input = sys.stdin.readline
n = int(input())
a = [int(input()) for _ in range(n)]
9
2077ms
310ms
基本的には
sys.stdin.readlineを
利用した方が良い!
※末尾の改行文字などは
 取り除かれないことに
 注意
Copyright(C) Nowcast, Inc. All rights reserved.
基本的なデータ構造の計算量
10
Copyright(C) Nowcast, Inc. All rights reserved.
lを長さnのListとする
■ ランダムアクセスはO(1)
● O(1)といいつつ遅いのでなるべく避けた方が良い(後述)
■ 末尾へのAppend / 末尾のPopは早いが、その他の場所のAppendやPopは遅い
■ inやmin、maxといった操作は直感的に書くことができ便利だが、O(n)
基本的なデータ構造の計算量
Listの各種操作の計算量
11
Operation Code example Average Case
Append l.append(x) O(1)
Pop last l.pop() O(1)
in x in l O(n)
min, max min(l), max(l) O(n)
Copyright(C) Nowcast, Inc. All rights reserved.
lを長さnのListとする
■ ランダムアクセスはO(1)
● O(1)といいつつ遅いのでなるべく避けるとよい(後述)
■ 末尾へのAppend / 末尾のPopは早いが、その他の場所のAppendやPopは遅い
■ inやmin、maxといった操作は直感的に書くことができ便利だが、O(n)
基本的なデータ構造の計算量
Listの各種操作の計算量
12
Operation Code example Average Case
Append l.append(x) O(1)
Pop last l.pop() O(1)
in x in l O(n)
min, max min(l), max(l) O(n)
SetやDictを
検討しよう!
Copyright(C) Nowcast, Inc. All rights reserved.
sをSet、dをDictとする
■ SetとDictはいわゆるハッシュテーブルというデータ構造
● C++の平衡二分探索木の Setとはまったく別物であることに注意!
● inが早い
• Listはinが遅いので、inを多用したい場合は Set / Dictでの実装が要検討
基本的なデータ構造の計算量
Set / Dictの各種操作の計算量
13
Operation Code example Average Case
in x in s O(1)
Add s.add() O(1)?
Operation Code example Average Case
in x in d O(1)
Get item d[x] O(1)
Set item d[x] = y O(1)
Set Dict
Copyright(C) Nowcast, Inc. All rights reserved.
Listの効率的な使い方
14
Copyright(C) Nowcast, Inc. All rights reserved.
Listのindexを使ったアクセス(ランダムアクセス)は非常に遅い。
indexによるアクセスは遅い
15
for i in range(n):
a[i]
for ai in a:
ai
for i, ai in enumerate(a):
ai
n = 10**7; a = list(range(n));
?
それぞれ実行時間は
何秒になるでしょう?
Copyright(C) Nowcast, Inc. All rights reserved.
Listのindexを使ったアクセス(ランダムアクセス)は非常に遅い。
indexによるアクセスは遅い
16
for i in range(len(a)):
a[i]
for ai in a:
ai
for i, ai in enumerate(a):
ai
n = 10**7; a = list(range(n));
ランダムアクセスはこのように
非常に遅い!
基本的には中段の書き方が
おすすめ!
indexが必要な場合は下段の
enumerateを使った書き方も。
Copyright(C) Nowcast, Inc. All rights reserved.
Sort関連
17
Copyright(C) Nowcast, Inc. All rights reserved.
ListのListなどのソートは遅いが、keyの指定の仕方で工夫できる
ListのListのソートにはoperator.itemgetter
18
a.sort(key=lambda x: x[1])
from operator import itemgetter
a.sort(key=itemgetter(1))
?
それぞれ実行時間は
何秒になるでしょう?
n = 10**6
a = [[random(), random(), random()] for i in range(n)]
Copyright(C) Nowcast, Inc. All rights reserved.
ListのListなどのソートは遅いが、keyの指定の仕方で工夫できる
ListのListのソートkeyにはoperator.itemgetter
19
a.sort(key=lambda x: x[1])
from operator import itemgetter
a.sort(key=itemgetter(1))
n = 10**6
a = [[random(), random(), random()] for i in range(n)]
ListのListの要素が文字列
だったりするとさらに遅く
なるので、keyにitemgetter
などを利用して高速化を
図るのが良い
Copyright(C) Nowcast, Inc. All rights reserved.
PythonとPyPy
20
Copyright(C) Nowcast, Inc. All rights reserved.
■ 安定したJIT(=Just In Time)コンパイラで、ほとんどすべての組み込みモジュールが提供されてい
る
■ Numpyなどは使用できないが、競技プログラミングでは基本的な制御構文とデータ構造を組み合
わせたコードを書くことが多いので、Pythonで書いたコードをそのままPyPyとして提出するだけ
で速度が上がることが多々ある
■ AtCoderで現在提供されているPyPy3 (7.3.0)はPython3.6.9と互換性のあるもの
PythonとPyPy
PyPyとは?
21
3.6.9 (7.3.0+dfsg-1~ppa1~ubuntu18.04, Dec 24 2019, 08:12:19)
[PyPy 7.3.0 with GCC 7.4.0]
https://www.pypy.org/index.html よりhttps://www.python.jp/pages/about.html より
Copyright(C) Nowcast, Inc. All rights reserved.
pyenvを使うと自分のパソコンで複数のPythonのバージョンを管理することができる。
以下のコマンドで切り替えができる。
詳細についてはpyenvのGithubをチェックしてみてください!!
PythonとPyPy
local環境へのinstall
22
$ pyenv local 3.8.2 # set to Python3.8
$ pyenv local pypy3.6-7.3.0 # set to PyPy3
$ pyenv install 3.8.2
$ pyenv install pypy3.6-7.3.0
Copyright(C) Nowcast, Inc. All rights reserved.
forやwhileが二重以上になるような場合、PyPyを使った方が明らかに早い。
PythonとPyPy
PyPyを使うと早くなる例
23
n, k = map(int, input().split())
h = tuple(map(int, input().split()))
dp = [10**10] * n
dp[0] = 0
for i in range(1, n):
dp[i] = min(dp[j] + abs(h[j] - h[i])
for j in range(max(0, i - k), i))
print(dp[n - 1])
EDPC B - Frog 2 (n <= 10**5, k <=100)
EDPC B - Frog 2
DPの問題で、制約は以下
■ n <= 10**5
■ k <= 100
左のようなO(nk)の二重ループの
コードをPython3とPyPy3両方で提
出するとどうなるか?
Copyright(C) Nowcast, Inc. All rights reserved.
forやwhileが二重以上になるような場合、PyPyを使った方が明らかに早い。
PythonとPyPy
PyPyを使うと早くなる例
24
n, k = map(int, input().split())
h = tuple(map(int, input().split()))
dp = [10**10] * n
dp[0] = 0
for i in range(1, n):
dp[i] = min(dp[j] + abs(h[j] - h[i])
for j in range(max(0, i - k), i))
print(dp[n - 1])
EDPC B - Frog 2 (n <= 10**5, k <=100)
Python3 : 1713 ms
vs.
PyPy3 : 343 ms
このようにまったく同じコード
でも、PyPyにするだけでかなり高速
化できる!
Copyright(C) Nowcast, Inc. All rights reserved.
基本的にはPyPyを使うだけでかなりの高速化が見込めるが、一部遅い処理もある
■ 再帰関数を用いた処理
■ 文字列に関連した処理
心配な場合は、local環境やAtCoderのコードテストで両言語で試してみてから早い法を提出するなど
すると良いと思います。
PythonとPyPy
Pythonの方が早い場合
25
Copyright(C) Nowcast, Inc. All rights reserved.
■ ハイパフォーマンスPython
■ Effective Python
■ https://wiki.python.org/moin/TimeComplexity
■ https://github.com/pyenv/pyenv
今回のコードはGithubで公開しています
■ https://github.com/Kevinrobot34/cp_python_tips/tree/master/pycon2020
References
26
Copyright(C) Nowcast, Inc. All rights reserved.
皆さんも是非Pythonで競プロを始めましょう!
本日の内容は後日加筆して
弊社テックブログ( https://medium.com/finatext )に
投稿予定です。そちらもよろしくお願いします!
Nowcast for Actionable Insights

More Related Content

What's hot

グレブナー基底を食べよう
グレブナー基底を食べようグレブナー基底を食べよう
グレブナー基底を食べよう
大好きbot グレブナー基底
 
Pythonエンジニアの最適なキャリアを考える (PyCon JP 2016 ジョブフェア LT)
Pythonエンジニアの最適なキャリアを考える (PyCon JP 2016 ジョブフェア LT)Pythonエンジニアの最適なキャリアを考える (PyCon JP 2016 ジョブフェア LT)
Pythonエンジニアの最適なキャリアを考える (PyCon JP 2016 ジョブフェア LT)
株式会社MonotaRO Tech Team
 
Indeedなう A日程 解説
Indeedなう A日程 解説Indeedなう A日程 解説
Indeedなう A日程 解説
AtCoder Inc.
 
機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門
hoxo_m
 
AlphaGoのしくみ
AlphaGoのしくみAlphaGoのしくみ
AlphaGoのしくみ
Hiroyuki Yoshida
 
fastTextの実装を見てみた
fastTextの実装を見てみたfastTextの実装を見てみた
fastTextの実装を見てみた
Yoshihiko Shiraki
 
よくわかるフリストンの自由エネルギー原理
よくわかるフリストンの自由エネルギー原理よくわかるフリストンの自由エネルギー原理
よくわかるフリストンの自由エネルギー原理
Masatoshi Yoshida
 
機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)
Satoshi Hara
 
機械学習で泣かないためのコード設計
機械学習で泣かないためのコード設計機械学習で泣かないためのコード設計
機械学習で泣かないためのコード設計
Takahiro Kubo
 
クラスタリングとレコメンデーション資料
クラスタリングとレコメンデーション資料クラスタリングとレコメンデーション資料
クラスタリングとレコメンデーション資料
洋資 堅田
 
明治大学講演資料「機械学習と自動ハイパーパラメタ最適化」 佐野正太郎
明治大学講演資料「機械学習と自動ハイパーパラメタ最適化」  佐野正太郎明治大学講演資料「機械学習と自動ハイパーパラメタ最適化」  佐野正太郎
明治大学講演資料「機械学習と自動ハイパーパラメタ最適化」 佐野正太郎
Preferred Networks
 
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
Hajime Fujita
 
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
Ken'ichi Matsui
 
π計算
π計算π計算
π計算
Yuuki Takano
 
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
Megagon Labs
 
ブレインパッドにおける機械学習プロジェクトの進め方
ブレインパッドにおける機械学習プロジェクトの進め方ブレインパッドにおける機械学習プロジェクトの進め方
ブレインパッドにおける機械学習プロジェクトの進め方
BrainPad Inc.
 
BlackBox モデルの説明性・解釈性技術の実装
BlackBox モデルの説明性・解釈性技術の実装BlackBox モデルの説明性・解釈性技術の実装
BlackBox モデルの説明性・解釈性技術の実装
Deep Learning Lab(ディープラーニング・ラボ)
 
バンディットアルゴリズム入門と実践
バンディットアルゴリズム入門と実践バンディットアルゴリズム入門と実践
バンディットアルゴリズム入門と実践
智之 村上
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
 
Devsumi 2018summer
Devsumi 2018summerDevsumi 2018summer
Devsumi 2018summer
Harada Kei
 

What's hot (20)

グレブナー基底を食べよう
グレブナー基底を食べようグレブナー基底を食べよう
グレブナー基底を食べよう
 
Pythonエンジニアの最適なキャリアを考える (PyCon JP 2016 ジョブフェア LT)
Pythonエンジニアの最適なキャリアを考える (PyCon JP 2016 ジョブフェア LT)Pythonエンジニアの最適なキャリアを考える (PyCon JP 2016 ジョブフェア LT)
Pythonエンジニアの最適なキャリアを考える (PyCon JP 2016 ジョブフェア LT)
 
Indeedなう A日程 解説
Indeedなう A日程 解説Indeedなう A日程 解説
Indeedなう A日程 解説
 
機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門機械学習のためのベイズ最適化入門
機械学習のためのベイズ最適化入門
 
AlphaGoのしくみ
AlphaGoのしくみAlphaGoのしくみ
AlphaGoのしくみ
 
fastTextの実装を見てみた
fastTextの実装を見てみたfastTextの実装を見てみた
fastTextの実装を見てみた
 
よくわかるフリストンの自由エネルギー原理
よくわかるフリストンの自由エネルギー原理よくわかるフリストンの自由エネルギー原理
よくわかるフリストンの自由エネルギー原理
 
機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)機械学習モデルの判断根拠の説明(Ver.2)
機械学習モデルの判断根拠の説明(Ver.2)
 
機械学習で泣かないためのコード設計
機械学習で泣かないためのコード設計機械学習で泣かないためのコード設計
機械学習で泣かないためのコード設計
 
クラスタリングとレコメンデーション資料
クラスタリングとレコメンデーション資料クラスタリングとレコメンデーション資料
クラスタリングとレコメンデーション資料
 
明治大学講演資料「機械学習と自動ハイパーパラメタ最適化」 佐野正太郎
明治大学講演資料「機械学習と自動ハイパーパラメタ最適化」  佐野正太郎明治大学講演資料「機械学習と自動ハイパーパラメタ最適化」  佐野正太郎
明治大学講演資料「機械学習と自動ハイパーパラメタ最適化」 佐野正太郎
 
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
 
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料 「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
「内積が見えると統計学も見える」第5回 プログラマのための数学勉強会 発表資料
 
π計算
π計算π計算
π計算
 
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
GiNZAで始める日本語依存構造解析 〜CaboCha, UDPipe, Stanford NLPとの比較〜
 
ブレインパッドにおける機械学習プロジェクトの進め方
ブレインパッドにおける機械学習プロジェクトの進め方ブレインパッドにおける機械学習プロジェクトの進め方
ブレインパッドにおける機械学習プロジェクトの進め方
 
BlackBox モデルの説明性・解釈性技術の実装
BlackBox モデルの説明性・解釈性技術の実装BlackBox モデルの説明性・解釈性技術の実装
BlackBox モデルの説明性・解釈性技術の実装
 
バンディットアルゴリズム入門と実践
バンディットアルゴリズム入門と実践バンディットアルゴリズム入門と実践
バンディットアルゴリズム入門と実践
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
Devsumi 2018summer
Devsumi 2018summerDevsumi 2018summer
Devsumi 2018summer
 

Similar to PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜

Introduction to Numpy (and Python) [JPN]
Introduction to Numpy (and Python) [JPN]Introduction to Numpy (and Python) [JPN]
Introduction to Numpy (and Python) [JPN]
MasaruOinaga
 
2017/12/21 虎の穴 Python勉強会
2017/12/21 虎の穴 Python勉強会2017/12/21 虎の穴 Python勉強会
2017/12/21 虎の穴 Python勉強会
虎の穴 開発室
 
20150625 cloudera
20150625 cloudera20150625 cloudera
20150625 cloudera
Recruit Technologies
 
Django_fukuoka
Django_fukuokaDjango_fukuoka
Django_fukuoka
ShuyaMotouchi1
 
Django_Fukuoka
Django_FukuokaDjango_Fukuoka
Django_Fukuoka
Shuya Motouchi
 
明日からはじめるネットワーク運用自動化
明日からはじめるネットワーク運用自動化明日からはじめるネットワーク運用自動化
明日からはじめるネットワーク運用自動化
Taiji Tsuchiya
 
GTMF 2016:「KiQ」が拓くゲームサーバの未来 株式会社アトミテック
GTMF 2016:「KiQ」が拓くゲームサーバの未来 株式会社アトミテックGTMF 2016:「KiQ」が拓くゲームサーバの未来 株式会社アトミテック
GTMF 2016:「KiQ」が拓くゲームサーバの未来 株式会社アトミテック
Game Tools & Middleware Forum
 
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!デベロッパーネットワーク
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perlJiro Nishiguchi
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
masahitojp
 
「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python
Takanori Suzuki
 
2018/1/30 Django勉強会
2018/1/30 Django勉強会2018/1/30 Django勉強会
2018/1/30 Django勉強会
虎の穴 開発室
 
171129-irex2017
171129-irex2017171129-irex2017
171129-irex2017
openrtm
 
Kstm lt 2021 12
Kstm lt 2021 12Kstm lt 2021 12
Kstm lt 2021 12
ssuser646a3e
 
Spring 5に備えるリアクティブプログラミング入門
Spring 5に備えるリアクティブプログラミング入門Spring 5に備えるリアクティブプログラミング入門
Spring 5に備えるリアクティブプログラミング入門
Takuya Iwatsuka
 
Security.gs fes 2010 in tokyo
Security.gs fes 2010 in tokyoSecurity.gs fes 2010 in tokyo
Security.gs fes 2010 in tokyo
Ren Sakamoto
 
Rustで楽しむ競技プログラミング
Rustで楽しむ競技プログラミングRustで楽しむ競技プログラミング
Rustで楽しむ競技プログラミング
yoshrc
 
Aerospike deep dive LDTs
Aerospike deep dive LDTsAerospike deep dive LDTs
Aerospike deep dive LDTs
Masaki Toyoshima
 

Similar to PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜 (20)

Introduction to Numpy (and Python) [JPN]
Introduction to Numpy (and Python) [JPN]Introduction to Numpy (and Python) [JPN]
Introduction to Numpy (and Python) [JPN]
 
2017/12/21 虎の穴 Python勉強会
2017/12/21 虎の穴 Python勉強会2017/12/21 虎の穴 Python勉強会
2017/12/21 虎の穴 Python勉強会
 
20150625 cloudera
20150625 cloudera20150625 cloudera
20150625 cloudera
 
Django_fukuoka
Django_fukuokaDjango_fukuoka
Django_fukuoka
 
Django_Fukuoka
Django_FukuokaDjango_Fukuoka
Django_Fukuoka
 
Why python
Why pythonWhy python
Why python
 
Why python
Why pythonWhy python
Why python
 
明日からはじめるネットワーク運用自動化
明日からはじめるネットワーク運用自動化明日からはじめるネットワーク運用自動化
明日からはじめるネットワーク運用自動化
 
GTMF 2016:「KiQ」が拓くゲームサーバの未来 株式会社アトミテック
GTMF 2016:「KiQ」が拓くゲームサーバの未来 株式会社アトミテックGTMF 2016:「KiQ」が拓くゲームサーバの未来 株式会社アトミテック
GTMF 2016:「KiQ」が拓くゲームサーバの未来 株式会社アトミテック
 
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
Yahoo!ニュースにおけるBFFパフォーマンスチューニング事例
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perl
 
Pyconjp2014_implementations
Pyconjp2014_implementationsPyconjp2014_implementations
Pyconjp2014_implementations
 
「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python
 
2018/1/30 Django勉強会
2018/1/30 Django勉強会2018/1/30 Django勉強会
2018/1/30 Django勉強会
 
171129-irex2017
171129-irex2017171129-irex2017
171129-irex2017
 
Kstm lt 2021 12
Kstm lt 2021 12Kstm lt 2021 12
Kstm lt 2021 12
 
Spring 5に備えるリアクティブプログラミング入門
Spring 5に備えるリアクティブプログラミング入門Spring 5に備えるリアクティブプログラミング入門
Spring 5に備えるリアクティブプログラミング入門
 
Security.gs fes 2010 in tokyo
Security.gs fes 2010 in tokyoSecurity.gs fes 2010 in tokyo
Security.gs fes 2010 in tokyo
 
Rustで楽しむ競技プログラミング
Rustで楽しむ競技プログラミングRustで楽しむ競技プログラミング
Rustで楽しむ競技プログラミング
 
Aerospike deep dive LDTs
Aerospike deep dive LDTsAerospike deep dive LDTs
Aerospike deep dive LDTs
 

Recently uploaded

LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
CRI Japan, Inc.
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
harmonylab
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
Toru Tamaki
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
Matsushita Laboratory
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
Matsushita Laboratory
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
Yuuitirou528 default
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
Fukuoka Institute of Technology
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
0207sukipio
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
chiefujita1
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance
 

Recently uploaded (14)

LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアルLoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
LoRaWAN 4チャンネル電流センサー・コンバーター CS01-LB 日本語マニュアル
 
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
【DLゼミ】XFeat: Accelerated Features for Lightweight Image Matching
 
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
論文紹介:When Visual Prompt Tuning Meets Source-Free Domain Adaptive Semantic Seg...
 
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdfFIDO Alliance Osaka Seminar: Welcome Slides.pdf
FIDO Alliance Osaka Seminar: Welcome Slides.pdf
 
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
TaketoFujikawa_物語のコンセプトに基づく情報アクセス手法の基礎検討_JSAI2024
 
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdfFIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
FIDO Alliance Osaka Seminar: PlayStation Passkey Deployment Case Study.pdf
 
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
ReonHata_便利の副作用に気づかせるための発想支援手法の評価---行為の増減の提示による気づきへの影響---
 
FIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdfFIDO Alliance Osaka Seminar: CloudGate.pdf
FIDO Alliance Osaka Seminar: CloudGate.pdf
 
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdfFIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
FIDO Alliance Osaka Seminar: LY-DOCOMO-KDDI-Mercari Panel.pdf
 
CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料CS集会#13_なるほどわからん通信技術 発表資料
CS集会#13_なるほどわからん通信技術 発表資料
 
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
単腕マニピュレータによる 複数物体の同時組み立ての 基礎的考察 / Basic Approach to Robotic Assembly of Multi...
 
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさJSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
JSAI_類似画像マッチングによる器への印象付与手法の妥当性検証_ver.3_高橋りさ
 
This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.This is the company presentation material of RIZAP Technologies, Inc.
This is the company presentation material of RIZAP Technologies, Inc.
 
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdfFIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
FIDO Alliance Osaka Seminar: NEC & Yubico Panel.pdf
 

PyCon2020 Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜

  • 1. Copyright(C) Nowcast, Inc. All rights reserved. Nowcast Pythonで競プロをしよう! 〜入門者が知っておくべき高速化Tips〜 2020年8月28日 株式会社ナウキャスト 大野 巧作 PyCon JP 2020 #pyconjp_4
  • 2. Copyright(C) Nowcast, Inc. All rights reserved. 2 ● 自己紹介 ● 標準入力 ● 基本的なデータ構造の計算量 ● Listの効率的な使い方 ● Sort関連 ● PythonとPyPy アジェンダ
  • 3. Copyright(C) Nowcast, Inc. All rights reserved. 3 ● 名前:大野巧作 ● 所属:株式会社ナウキャスト ○ データサイエンティスト・データエンジニア ● Python歴:3年 ● 好きな標準ライブラリ:itertools ● AtCoderアカウント:Kevinrobot34 自己紹介
  • 4. Copyright(C) Nowcast, Inc. All rights reserved. 4 ● 名前:大野巧作 ● 所属:株式会社ナウキャスト ○ データサイエンティスト・データエンジニア ● Python歴:3年 ● 好きな標準ライブラリ:itertools ● AtCoderアカウント:Kevinrobot34 自己紹介
  • 5. Copyright(C) Nowcast, Inc. All rights reserved. 競プロでは実行速度の早いC++がメジャーですが、近年Pythonでの参加者も増えています。 Pythonは書きやすさが人気の一つですが、やはり実行速度はC++に比べると遅いです。 このセッションではPythonで競プロをする際に、知っておくとそれだけで実行時間を短く できたりするようなテクニックを紹介していきます! 紹介すること ■ Pythonで競プロをする上で気をつけた方が良い書き方 ■ PyPyを用いた高速化 紹介しないこと ■ numpyやnumbaを用いた高速化 Overview 5
  • 6. Copyright(C) Nowcast, Inc. All rights reserved. ■ 個人のMacBookProを利用して実験 ■ 基本的にはPythonのtimeitを使って10回繰り返し実行し、計測時間を観察した ■ 一部shellのtimeコマンドも利用 ■ AtCoderへの提出した際の実行時間のことも 時間の計測方法について 6
  • 7. Copyright(C) Nowcast, Inc. All rights reserved. 標準入力 7
  • 8. Copyright(C) Nowcast, Inc. All rights reserved. 組み込み関数のinput()はかなり遅い! 標準入力 inputとsys.stdin.readline n = int(input()) a = [int(input()) for _ in range(n)] import sys input = sys.stdin.readline n = int(input()) a = [int(input()) for _ in range(n)] 8 1000000 1 2 3 4 ...
  • 9. Copyright(C) Nowcast, Inc. All rights reserved. 組み込み関数のinput()はかなり遅い! 標準入力 inputとsys.stdin.readline n = int(input()) a = [int(input()) for _ in range(n)] import sys input = sys.stdin.readline n = int(input()) a = [int(input()) for _ in range(n)] 9 2077ms 310ms 基本的には sys.stdin.readlineを 利用した方が良い! ※末尾の改行文字などは  取り除かれないことに  注意
  • 10. Copyright(C) Nowcast, Inc. All rights reserved. 基本的なデータ構造の計算量 10
  • 11. Copyright(C) Nowcast, Inc. All rights reserved. lを長さnのListとする ■ ランダムアクセスはO(1) ● O(1)といいつつ遅いのでなるべく避けた方が良い(後述) ■ 末尾へのAppend / 末尾のPopは早いが、その他の場所のAppendやPopは遅い ■ inやmin、maxといった操作は直感的に書くことができ便利だが、O(n) 基本的なデータ構造の計算量 Listの各種操作の計算量 11 Operation Code example Average Case Append l.append(x) O(1) Pop last l.pop() O(1) in x in l O(n) min, max min(l), max(l) O(n)
  • 12. Copyright(C) Nowcast, Inc. All rights reserved. lを長さnのListとする ■ ランダムアクセスはO(1) ● O(1)といいつつ遅いのでなるべく避けるとよい(後述) ■ 末尾へのAppend / 末尾のPopは早いが、その他の場所のAppendやPopは遅い ■ inやmin、maxといった操作は直感的に書くことができ便利だが、O(n) 基本的なデータ構造の計算量 Listの各種操作の計算量 12 Operation Code example Average Case Append l.append(x) O(1) Pop last l.pop() O(1) in x in l O(n) min, max min(l), max(l) O(n) SetやDictを 検討しよう!
  • 13. Copyright(C) Nowcast, Inc. All rights reserved. sをSet、dをDictとする ■ SetとDictはいわゆるハッシュテーブルというデータ構造 ● C++の平衡二分探索木の Setとはまったく別物であることに注意! ● inが早い • Listはinが遅いので、inを多用したい場合は Set / Dictでの実装が要検討 基本的なデータ構造の計算量 Set / Dictの各種操作の計算量 13 Operation Code example Average Case in x in s O(1) Add s.add() O(1)? Operation Code example Average Case in x in d O(1) Get item d[x] O(1) Set item d[x] = y O(1) Set Dict
  • 14. Copyright(C) Nowcast, Inc. All rights reserved. Listの効率的な使い方 14
  • 15. Copyright(C) Nowcast, Inc. All rights reserved. Listのindexを使ったアクセス(ランダムアクセス)は非常に遅い。 indexによるアクセスは遅い 15 for i in range(n): a[i] for ai in a: ai for i, ai in enumerate(a): ai n = 10**7; a = list(range(n)); ? それぞれ実行時間は 何秒になるでしょう?
  • 16. Copyright(C) Nowcast, Inc. All rights reserved. Listのindexを使ったアクセス(ランダムアクセス)は非常に遅い。 indexによるアクセスは遅い 16 for i in range(len(a)): a[i] for ai in a: ai for i, ai in enumerate(a): ai n = 10**7; a = list(range(n)); ランダムアクセスはこのように 非常に遅い! 基本的には中段の書き方が おすすめ! indexが必要な場合は下段の enumerateを使った書き方も。
  • 17. Copyright(C) Nowcast, Inc. All rights reserved. Sort関連 17
  • 18. Copyright(C) Nowcast, Inc. All rights reserved. ListのListなどのソートは遅いが、keyの指定の仕方で工夫できる ListのListのソートにはoperator.itemgetter 18 a.sort(key=lambda x: x[1]) from operator import itemgetter a.sort(key=itemgetter(1)) ? それぞれ実行時間は 何秒になるでしょう? n = 10**6 a = [[random(), random(), random()] for i in range(n)]
  • 19. Copyright(C) Nowcast, Inc. All rights reserved. ListのListなどのソートは遅いが、keyの指定の仕方で工夫できる ListのListのソートkeyにはoperator.itemgetter 19 a.sort(key=lambda x: x[1]) from operator import itemgetter a.sort(key=itemgetter(1)) n = 10**6 a = [[random(), random(), random()] for i in range(n)] ListのListの要素が文字列 だったりするとさらに遅く なるので、keyにitemgetter などを利用して高速化を 図るのが良い
  • 20. Copyright(C) Nowcast, Inc. All rights reserved. PythonとPyPy 20
  • 21. Copyright(C) Nowcast, Inc. All rights reserved. ■ 安定したJIT(=Just In Time)コンパイラで、ほとんどすべての組み込みモジュールが提供されてい る ■ Numpyなどは使用できないが、競技プログラミングでは基本的な制御構文とデータ構造を組み合 わせたコードを書くことが多いので、Pythonで書いたコードをそのままPyPyとして提出するだけ で速度が上がることが多々ある ■ AtCoderで現在提供されているPyPy3 (7.3.0)はPython3.6.9と互換性のあるもの PythonとPyPy PyPyとは? 21 3.6.9 (7.3.0+dfsg-1~ppa1~ubuntu18.04, Dec 24 2019, 08:12:19) [PyPy 7.3.0 with GCC 7.4.0] https://www.pypy.org/index.html よりhttps://www.python.jp/pages/about.html より
  • 22. Copyright(C) Nowcast, Inc. All rights reserved. pyenvを使うと自分のパソコンで複数のPythonのバージョンを管理することができる。 以下のコマンドで切り替えができる。 詳細についてはpyenvのGithubをチェックしてみてください!! PythonとPyPy local環境へのinstall 22 $ pyenv local 3.8.2 # set to Python3.8 $ pyenv local pypy3.6-7.3.0 # set to PyPy3 $ pyenv install 3.8.2 $ pyenv install pypy3.6-7.3.0
  • 23. Copyright(C) Nowcast, Inc. All rights reserved. forやwhileが二重以上になるような場合、PyPyを使った方が明らかに早い。 PythonとPyPy PyPyを使うと早くなる例 23 n, k = map(int, input().split()) h = tuple(map(int, input().split())) dp = [10**10] * n dp[0] = 0 for i in range(1, n): dp[i] = min(dp[j] + abs(h[j] - h[i]) for j in range(max(0, i - k), i)) print(dp[n - 1]) EDPC B - Frog 2 (n <= 10**5, k <=100) EDPC B - Frog 2 DPの問題で、制約は以下 ■ n <= 10**5 ■ k <= 100 左のようなO(nk)の二重ループの コードをPython3とPyPy3両方で提 出するとどうなるか?
  • 24. Copyright(C) Nowcast, Inc. All rights reserved. forやwhileが二重以上になるような場合、PyPyを使った方が明らかに早い。 PythonとPyPy PyPyを使うと早くなる例 24 n, k = map(int, input().split()) h = tuple(map(int, input().split())) dp = [10**10] * n dp[0] = 0 for i in range(1, n): dp[i] = min(dp[j] + abs(h[j] - h[i]) for j in range(max(0, i - k), i)) print(dp[n - 1]) EDPC B - Frog 2 (n <= 10**5, k <=100) Python3 : 1713 ms vs. PyPy3 : 343 ms このようにまったく同じコード でも、PyPyにするだけでかなり高速 化できる!
  • 25. Copyright(C) Nowcast, Inc. All rights reserved. 基本的にはPyPyを使うだけでかなりの高速化が見込めるが、一部遅い処理もある ■ 再帰関数を用いた処理 ■ 文字列に関連した処理 心配な場合は、local環境やAtCoderのコードテストで両言語で試してみてから早い法を提出するなど すると良いと思います。 PythonとPyPy Pythonの方が早い場合 25
  • 26. Copyright(C) Nowcast, Inc. All rights reserved. ■ ハイパフォーマンスPython ■ Effective Python ■ https://wiki.python.org/moin/TimeComplexity ■ https://github.com/pyenv/pyenv 今回のコードはGithubで公開しています ■ https://github.com/Kevinrobot34/cp_python_tips/tree/master/pycon2020 References 26
  • 27. Copyright(C) Nowcast, Inc. All rights reserved. 皆さんも是非Pythonで競プロを始めましょう! 本日の内容は後日加筆して 弊社テックブログ( https://medium.com/finatext )に 投稿予定です。そちらもよろしくお願いします! Nowcast for Actionable Insights