皆さん、こんにちは!
この記事を読んでいる人は、おそらく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()