1
2

More than 3 years have passed since last update.

pythonのスピードアップに関して(メモ)

Posted at
speed01.py
import time


def test01():
    time01 = time.time()
    str1 = ""
    for i in range(1000000):
        str1 += str(i)
    time02 = time.time()
    print("test01でかかった時間:{:.6f}s".format(time02 - time01))


def test02():
    time01 = time.time()
    lst1 = []
    for i in range(1000000):
        lst1.append(str(i))
    str1 = "".join(lst1)
    time02 = time.time()
    print("test02でかかった時間:{:.6f}s".format(time02 - time01))


test01()
test02()
実行結果:
test01でかかった時間:1.515000s
test02でかかった時間:0.330000s

※joinを利用した方がスピードは速いです


speed02.py
import time


def test01():
    time01 = time.time()
    n = 0
    sum = 0
    while (n < 10000000):
        sum += n
        n += 1
    time02 = time.time()
    print("test01でかかった時間:{:.6f}s".format(time02 - time01))


def test02():
    time01 = time.time()
    sum = 0
    for n in range(10000000):
        sum += n
    time02 = time.time()
    print("test02でかかった時間:{:.6f}s".format(time02 - time01))


test01()
test02()
実行結果:
test01でかかった時間:0.970000s
test02でかかった時間:0.559000s

※whileよりforを利用した方がスピードは速いです


speed03.py
from functools import lru_cache
import time


def fibonacci_number1(n):
    return n if n < 2 else fibonacci_number1(n - 1) + fibonacci_number1(n - 2)


@lru_cache()
def fibonacci_number2(n):
    return n if n < 2 else fibonacci_number2(n - 1) + fibonacci_number2(n - 2)


t1 = time.time()
fibonacci_number1(35)
t2 = time.time()
fibonacci_number2(35)
t3 = time.time()

print("lru_cacheを利用しない場合の所要時間:{:.6f}s".format(t2 - t1))
print("lru_cacheを利用した場合の所要時間:{:.6f}s".format(t3 - t2))
実行結果:
lru_cacheを利用しない場合の所要時間:3.699000s
lru_cacheを利用した場合の所要時間:0.000000s

※場合により、functools.lru_cacheを利用した方が圧倒的に速いです


speed04.py
import time
from math import sqrt


def test01():
    time01 = time.time()
    for i in range(10000000):
        sqrt(33)
    time02 = time.time()
    print("test01でかかった時間:{:.6f}s".format(time02 - time01))


def test02():
    time01 = time.time()
    sqrt_in = sqrt
    for i in range(10000000):
        sqrt_in(33)
    time02 = time.time()
    print("test02でかかった時間:{:.6f}s".format(time02 - time01))


test01()
test02()
実行結果:
test01でかかった時間:1.631000s
test02でかかった時間:1.533000s

※ローカルの方がスピードは速いです


speed05.py
import time


def test01():
    time01 = time.time()
    lst = []
    for i in range(10000000):
        lst.append(i)
    time02 = time.time()
    print("test01でかかった時間:{:.6f}s".format(time02 - time01))


def test02():
    time01 = time.time()
    lst = []
    append = lst.append
    for i in range(10000000):
        append(i)  # lst.appendの代わりにappendを利用することでスピードが改善できる
    time02 = time.time()
    print("test02でかかった時間:{:.6f}s".format(time02 - time01))


def test03():
    time01 = time.time()
    lst = [i for i in range(10000000)]
    time02 = time.time()
    print("test03でかかった時間:{:.6f}s".format(time02 - time01))


test01()
test02()
test03()
実行結果:
test01でかかった時間:1.023000s
test02でかかった時間:0.686000s
test03でかかった時間:0.542000s

※リスト内包表記の方が速いです


speed06.py
import time
from numba import jit


def test01(x, y):
    time01 = time.time()
    sum = 0
    for i in range(x, y):
        sum += i
    time02 = time.time()
    print("test01でかかった時間:{:.6f}s".format(time02 - time01))
    return sum


@jit
def test02(x, y):
    time01 = time.time()
    sum = 0
    for i in range(x, y):
        sum += i
    time02 = time.time()
    print("test02でかかった時間:{:.6f}s".format(time02 - time01))
    return sum


sum1 = test01(1, 100000000)
sum2 = test02(1, 100000000)
実行結果:
test01でかかった時間:5.534000s
test02でかかった時間:0.040000s

※JITコンパイラライブラリNumbaを使った方が100倍高速に実行でき、
 C言語のようなパフォーマンスを得ることができるようです

※Numbaをインストールする必要があります 
 なお、anacondaでpythonをインストールした場合、最初からNumbaが入っているようです

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2