🐍

都市伝説pythonのfor文とmap()の処理速度は全然違う説

2022/09/19に公開

●結論
map()よりもfor文が全てにおいて僅かに早い。(python3.10)

・検証A、1万字の文字列をジェネレーターにした後、繋げて文字列を作る(abc...➡abc...)
・検証B、1万字の文字列をジェネレーターにした後、@文字を挟んで繋げて文字列を作る(abc...➡a@b@c@...)

それぞれに対して
・検証1、for文 {VS} map()
・検証2、for文のネスト(検証A/Bを10回繰り返す) {VS} map()のネスト(検証A/Bを10回繰り返す)
・検証3、for文の2重ネスト(検証A/Bを10回10回繰り返す) {VS} map()の2重ネスト(検証A/Bを10回10回繰り返す)

●検証A検証1 for文で1万字の処理速度 0.001

#検証A検証1 for文で1万字の処理速度 0.001
import time
from typing import Generator

def main() -> None:
    startTime = time.time()
    text: str = createRandomText()
    print("文字数: ", len(text))
    print("実行タイムを計る: ", round(time.time() - startTime, 6))


def createRandomText() -> str:
    
    #TEXT_LEN: int = 10000
    texts = "kxbdymcv...中略...pmpit"

    def createText() -> Generator:
        for text in texts:
            yield text
    
    return  "".join(createText())

if __name__ == '__main__':
    main()

●検証A検証1 map()で1万字の処理速度 0.001

#検証A検証1 map()で1万字の処理速度 0.001
import time
from typing import Generator

def main() -> None:
    startTime = time.time()
    text: str = createRandomText()
    print("文字数: ", len(text))
    print("実行タイムを計る: ", round(time.time() - startTime, 6))


def createRandomText() -> str:
    
    #TEXT_LEN: int = 10000
    texts = "kxbdymcv...中略...pmpit"

    def createText() -> Generator:
        return map(lambda text: text, texts)
    
    return  "".join(createText())

if __name__ == '__main__':
    main()

●#検証A検証2 for文のネストで10万字の処理速度 0.006

#検証A検証2 for文のネストで10万字の処理速度 0.006
import time
from typing import Generator

def main() -> None:
    startTime = time.time()
    text: str = createRandomText()
    print("文字数: ", len(text))
    print("実行タイムを計る: ", round(time.time() - startTime, 6))


def createRandomText() -> str:
    
    #TEXT_LEN: int = 10000
    texts = "kxbdymcv...中略...pmpit"

    def createText() -> Generator:
        for _ in range(10):
            for text in texts:
                yield text
    
    return  "".join(createText())

if __name__ == '__main__':
    main()

●#検証A検証2 map()のネストで10万字の処理速度 0.007

#検証A検証2 map()のネストで10万字の処理速度 0.007
import time
from typing import Generator
from itertools import chain

def main() -> None:
    startTime = time.time()
    text: str = createRandomText()
    print("文字数: ", len(text))
    print("実行タイムを計る: ", round(time.time() - startTime, 6))


def createRandomText() -> str:
    
    #TEXT_LEN: int = 10000
    texts = "kxbdymcv...中略...pmpit"

    def createText() -> Generator:
        return chain.from_iterable( map(lambda num: \
        map(lambda text: text, texts), range(10)) ) #毎回新しくオブジェクト作成

    
    return  "".join(createText())

if __name__ == '__main__':
    main()

●検証A検証3 for文の2重ネストで100万字の処理速度 0.063

#検証A検証3 for文の2重ネストで100万字の処理速度 0.063
import time
from typing import Generator

def main() -> None:
    startTime = time.time()
    text: str = createRandomText()
    print("文字数: ", len(text))
    print("実行タイムを計る: ", round(time.time() - startTime, 6))


def createRandomText() -> str:
    
    #TEXT_LEN: int = 10000
    texts = "kxbdymcv...中略...pmpit"

    def createText() -> Generator:
        for _ in range(10):
            for _ in range(10):
                for text in texts:
                    yield text
    
    return  "".join(createText())

if __name__ == '__main__':
    main()

●検証A検証3 map()の2重ネストで100万字の処理速度 0.081

#検証A検証3 map()の2重ネストで100万字の処理速度 0.081
import time
from typing import Generator
from itertools import chain

def main() -> None:
    startTime = time.time()
    text: str = createRandomText()
    print("文字数: ", len(text))
    print("実行タイムを計る: ", round(time.time() - startTime, 6))


def createRandomText() -> str:
    
    #TEXT_LEN: int = 10000
    texts = "kxbdymcv...中略...pmpit"

    def createText() -> Generator:
        return chain.from_iterable( map(lambda out_num: \
        chain.from_iterable( map(lambda num: \
        map(lambda text: text, texts), range(10)) ), range(10)) ) #毎回新しくオブジェクト作成
    
    return  "".join(createText())

if __name__ == '__main__':
    main()

for文とmap()の処理速度は処理内容により変わるのではないかと思うので今後検証して更新していく。

Discussion

ログインするとコメントできます