walkingmask’s development log

IT系の情報などを適当に書いていきます

MENU

ちょっとだけpython(2.7)プログラム高速化のためのlog

AOJでpythonを使ってて「え?こんなとこでそんなに変わるの?」っていう高速化ポイントがあったのでlog.python初心者向けtipsです.

処理の関数化

今までCを触ってて,処理を関数としてまとめたら早くなったとい経験がなかったので違和感のあったポイント.試しに以下のような「処理を関数化しない場合」「処理を関数化した場合」の2つのコードを作成し,実行結果を比較してみる.

関数化しない場合のコード temp1.py

import time

a = [i for i in xrange(100000)]
b = [j for j in xrange(100000, 200000)]

start = time.time()

s = 0
for (i, j) in zip(a, b):
    s += i+j

print s
print time.time()-start,"s"

関数化した場合のコード temp2.py

import time

a = [i for i in xrange(100000)]
b = [j for j in xrange(100000, 200000)]

start = time.time()

def f(a, b):
    s = 0
    for (i, j) in zip(a, b):
        s += i+j
    return s

print f(a, b)

print time.time()-start,"s"

それぞれの実行結果

関数化しない場合
% python temp1.py     
19999900000
0.0419380664825 s

関数化した場合
% python temp2.py
19999900000
0.0335659980774 s

このケースでは約 0.01sec の差でしたが,データ量や処理の多さによっては更に差が大きくなるような気がする.0.01sec も決して小さな値ではないので,積極的に関数化をしていきたいと思った.

input() ではなく int(raw_input()) を使う

これがかなり意外だったケース.なぜこんなに違うのか...それぞれの場合のコードと実行結果は以下.

input()を使った場合のコード temp3.py

import time

start = time.time()

# gyosu
n = input()

a = []
for i in xrange(n):
    a.append(input())

print len(a)
print time.time()-start,"s"

int(raw_input())を使った場合のコード temp4.py

import time

start = time.time()

# gyosu
n = int(raw_input())

a = []
for i in xrange(n):
    a.append(int(raw_input()))

print len(a)
print time.time()-start,"s"

ぞれぞれの実行結果

input()を使った場合
% python temp3.py <in
100000
0.642402887344 s

int(raw_input())を使った場合
% python temp4.py <in
100000
0.197404146194 s

100000の読み込み&list.append()で約0.45秒の差.これは大きい.なぜ...

この検証をする間に,xrangeとrangeだとどちらが早いかとふと気になって試してみた.大差はなさそうだけど,xrangeの方が体感少し早い気がした.