mapと繰り返し文|Pythonにおける処理高速化をラフに考える #2

f:id:lib-arts:20201113203327j:plain

このシリーズではPythonの処理高速化についてラフに取り扱っています。
#1では「%%time」を用いたパフォーマンス測定と、NumPyを用いた簡単な高速化について確認しました。

#2ではmapと繰り返し文(for)について簡単に取り扱います。
以下、目次になります。
1. Pythonの組み込み関数mapについて
2. mapを用いた高速化について
3. まとめ

 

1. Pythonの組み込み関数mapについて
1節ではPythonの組み込み関数のmapの概要について簡単に確認します。

f:id:lib-arts:20201118213122p:plain

組み込み関数 — Python 3.9.0 ドキュメント

上記の記載では、mapは関数(function)と配列(iterable)を引数に取るとされています。処理については2節で取り扱いますが、関数(function)の処理を配列(iterable)に対して実行するという流れです。これによって、for文の内部で記述するような処理をmapを用いて記載することが可能になります。また、この際に関数にlambdaを用いた無名関数を用いてシンプルに記述するなどの記載例もあります。

mapの簡単な概要はつかめたので1節はここまでとします。

 

2. mapを用いた高速化について
2節ではmapを用いた高速化について簡単に確認します。

%%time

for i in range(20000):
    a = 1
    while a<10000:
        a += 1
    if i%5000==0:
        print(a)

f:id:lib-arts:20201118214043p:plain

上記の処理をmapで置き換えるとします。下記を実行してみましょう。

%%time

import numpy as np
import pandas as pd

def calc_experiment(x):
    a=int(x)
    while a < 10000:
        a += 1
    return a

b = np.ones([20000], dtype=np.int)
x = map(calc_experiment, b)

i=0
for z in x:
    if i%5000==0:
        print(z)

    i+=1

f:id:lib-arts:20201118214427p:plain

実行速度としては、上記のように少しだけ高速化が実現できています。また、mapはnextを用いて下記のように記述することもできます。

%%time

def calc_experiment(x):
    a=int(x)
    while a < 10000:
        a += 1
    return a

b = np.ones([20000], dtype=np.int)
x = map(calc_experiment, b)

for i in range(b.shape[0]):
    z = next(x)
    if i%5000==0:
        print(z) 

f:id:lib-arts:20201118214755p:plain

こちらの方が処理としては記述しやすいかもしれません。lambdaを使った例も確認できればということで、もう一例確認してみましょう。

%%time

judges = list()
for i in range(10000000):
    judge = ""
    if i%2==0:
        judge="even"
    else:
        judge="odd"
    judges.append(judge)

print(judges[:10])

f:id:lib-arts:20201118221424p:plain

上記をmapとlambdaを用いて記述すると下記のようになります。

%%time

a = range(10000000)
a2 = map(lambda x: 'even' if x % 2 == 0 else 'odd', a)

judges = list(a2)
print(judges[:10])

f:id:lib-arts:20201118221454p:plain

高速化としては、処理速度が2倍ほどになっていることが確認できます。また、処理の記述をシンプルに行えているというのもあります。


3. まとめ
#2では繰り返し文をmapで表現するというのを取り扱いました。今回の例では大体が1.5倍〜2倍の高速化になりましたが、高速化については他の例も確認しつつ改めて議論できればと思います。また、関連でlambdaの記法についても取り扱いました。
#3では今回取り扱ったmapやlambdaをPandasの形式に対して適用してみようと思います。