pythonのスピードアップに関して（メモ）


```python: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を利用した方がスピードは速いです

***
```python: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を利用した方がスピードは速いです

***

```python: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を利用した方が圧倒的に速いです

***

```python: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
```

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

***

```python: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
```


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

***

```python: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が入っているようです