for loop vs reduce:足し算の実行速度比較

pythonWeb開発

皆さん、こんにちは!

この記事を読んでいる人は、おそらくfunctoolsのreduceを使っている人だと思うのですが。。

わたしは、いままでfunctoolsのreduceを使ったのは1度しかないですw

本日は、for loopで普通に足した場合とfunctoolsのreduceで足し算を行った場合にどちらが早いのかが気になったので、計測してみました。

環境

# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)

# python --version
Python 3.9.1

実験内容

以下の2つの条件でどちらが計算速度が速いのかを検証してみる。

  • for loopの足し算
  • functoolsのreduceの足し算

足し算の内容は、単に1をX回足していくだけとします。

結果

引数で、足し算の回数を渡しています。

結果は以下のようになりました!

# python loop_vs_reduce.py 1000
reduce time:    0:00:00.000023
loop time:      0:00:00.000023

# python loop_vs_reduce.py 10000
reduce time:    0:00:00.000209
loop time:      0:00:00.000261

# python loop_vs_reduce.py 100000
reduce time:    0:00:00.002438
loop time:      0:00:00.002239

# python loop_vs_reduce.py 1000000
reduce time:    0:00:00.022739
loop time:      0:00:00.023247

# python loop_vs_reduce.py 10000000
reduce time:    0:00:00.215010
loop time:      0:00:00.231702

# python loop_vs_reduce.py 100000000
reduce time:    0:00:02.160887
loop time:      0:00:02.387605

あまり変わらないですね。。

ややreduceのほうが早いくらいでしょうか。。。

今回は以上です。ではまた!

今回の検証に使用したソースコード

import sys
from typing import Callable
from datetime import datetime
from functools import reduce
from operator import add

number_list = []


def set_number_list(max_number: int) -> None:
    global number_list
    number_list = []
    for i in range(0, max_number):
        number_list.append(1)


# reduce
def do_reduce() -> None:
    reduce(add, number_list)


# loop
def do_loop() -> None:
    total = 0
    for n in number_list:
        total += n


def do_test(func: Callable, title: str) -> None:
    s_time = datetime.now()
    func()
    e_time = datetime.now()
    print(f"{title} time:\t{e_time - s_time}")


def main():
    max_number = 1000
    if len(sys.argv) > 1:
        max_number = int(sys.argv[1])
    set_number_list(max_number)

    # reduce
    do_test(do_reduce, "reduce")

    # loop
    do_test(do_loop, "loop")


if __name__ == "__main__":
    main()
タイトルとURLをコピーしました