解き方そのものではなく、速度の問題で覚えたものをあげていきます。
厳密な根拠は少しずつ理解していければなと。
コードの速度計測に使用めも
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)]
参考