Python高速化の方法覚えたことまとめ

解き方そのものではなく、速度の問題で覚えたものをあげていきます。
厳密な根拠は少しずつ理解していければなと。

コードの速度計測に使用めも

import time

start = time.time()

process_time = time.time() - start

print(process_time)

本編

  • forよりもリスト内包表記を使用する。

  • グローバル変数よりもローカル変数化して書いた方が高速。

def main():
    """"ここに今までのコード"""

if __name__ == '__main__':
    main()
  • PyPyを使った方が基本的に同じコードでも高速。

  • inputではなくsysのreadlineを使用した方が速い。ただし、文字列のときは改行文字を消す処理を行うこと

import sys
input=sys.stdin.readline
n = input().rstrip()

小ネタ

  • 操作の視認性を高くしておく。テーマと同系色の操作を減らす。
    • コメントを気持ち明るめに
    • 選択範囲も同じく少し明るめに。
# AtCoder用のコピペ集
"""
初期操作
"""

# 立ち上げ時のコピペ内容

import math
from math import gcd,pi,sqrt
INF = float("inf")
MOD = 10**9 + 7

import sys
sys.setrecursionlimit(10**6)
import itertools
import bisect
from collections import Counter,deque
def i_input(): return int(input())
def i_map(): return map(int, input().split())
def i_list(): return list(i_map())
def i_row(N): return [i_input() for _ in range(N)]
def i_row_list(N): return [i_list() for _ in range(N)]
def s_input(): return input()
def s_map(): return input().split()
def s_list(): return list(s_map())
def s_row(N): return [s_input for _ in range(N)]
def s_row_str(N): return [s_list() for _ in range(N)]
def s_row_list(N): return [list(s_input()) for _ in range(N)]


def main():


if __name__=="__main__":
    main()

# 入力操作

## 単純な数字
n = int(input())

## 文字入力
n = input().rstrip() # readlineが改行文字含むので注意!

## 値を分割して保持
a,b = map(int, input().split())

## リストとして保持
l = list(map(int, input().split()))

"""
配列操作
"""

# 組み合わせ系

## 順列
list(itertools.permutations(list, n))

## 組み合わせ
list(itertools.combinations(list, n))

## 出現回数

l = Counter(list)
l.most_common()

## nCrのmod計算

def fur(n,r):
    p,q = 1, 1
    for i in range(r):
        p = p*(n-i)%MOD
        q = q*(i+1)%MOD
    return (p * pow(q,MOD-2,MOD)) % MOD

## 普通のnCr

def comb(n, r):
    if n-r>=0:
        return math.factorial(n) // (math.factorial(n - r) * math.factorial(r))
    else:
        return 0

"""
数値計算
"""

## 単純な素数判定
def isPrime(n):
    if n == 2:
        return True
    if n%2 == 0 or n == 1:
        return False
    m = math.floor(math.sqrt(n))+1
    for p in range(3,m,2):
        if n%p == 0:
            return False
    return True

## エラトステネスの篩
def primes(n):
    is_prime = [True] * (n + 1)
    is_prime[0], is_prime[1] = False, False
    for i in range(2, int(n**0.5) + 1):
        if not is_prime[i]:
            continue
        for j in range(i * 2, n + 1, i):
            is_prime[j] = False
    return [i for i in range(n + 1) if is_prime[i]]

## 最大公約数
gcd(a,b)

## 最小公倍数
a*b//gcd(a,b)

## 素因数分解:O(n**1/2)
def prime_decomposition(n):
    i = 2
    table = []
    while i * i <= n: # sqrt(n)で計算が済む
        while n % i == 0:
            n //= i
            table.append(i)
        i += 1
    if n > 1:
        table.append(n)
    return table

"""
配列操作
"""

## 転置行列

l_2 = [list(x) for x in zip(*l)]

参考

pythonの速度で気にするところ(高速化メモ) - nobUnagaの日記

https://juppy.hatenablog.com/entry/2019/06/14/Python_%E7%AB%B6%E6%8A%80%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E9%AB%98%E9%80%9F%E5%8C%96tips_%28Python%E3%81%A7Atcoder%E3%82%92%E3%82%84%E3%82%8B%E9%9A%9B%E3%81%AB%E5%80%8B

Python で AtCoder を遊ぶときに知ってると便利かもしれないこと - 菜