파이썬에서 문자열을 변환 (a -> b) 할 때 if 문과 사전 유형 중 어느 것이 더 빠릅니까?

배경으로 한 일



GCP의 Cloud Functions에서 '사과'라면 '과일', '딸기'라면 '야채'와 같이 매번 입력을 쌍이 되는 단어로 변환하고 싶었지만,
if문으로 고리고리 변환하는 것과 사전형의 대응표를 준비해 변환하는 어느 쪽이 빠른 것인지 궁금해서 생각해 보았습니다.
주)또한 자신의 경우는 콜드 스타트가 되는 경우가 많기 때문에, 사전형 생성도 포함한 소요 시간을 계산하고 있습니다

결론



매번 사전형 로드가 발생하는 경우(예: AWS Lambda 또는 GCP Cloud Functions 콜드 스타트 ​​시 등)
if 문이 더 빠릅니다.

키가 5자인 경우


키가 10자인 경우

(Colab 사용했기 때문에 각 회의 처리 속도가 안정되지 않았을지도 모릅니다)

if문의 압승이었습니다.

콜드 스타트가 아닌 경우는 사전형이 빠른 기분이 들기 때문에, 마음이 향하면 시험해 봅니다
(if 문서 쿠노 멘도쿠사이...)

환경



파이썬 3
Google 공동체

검증 조건



· 키 수를 변경하여 동일한 셀에서 비교하는 코드를 100 번 실행하고 소요 시간의 평균으로 비교
・키수는 5개, 10개, 25개, 50개, 100개, 200개 6패턴

검증 코드 예



준비
import time
import random, string
from statistics import mean

# ランダム文字列作成(参考の「Pythonを使ってランダムな文字列を生成」からお借りしました)
def randomname(n):
   return ''.join(random.choices(string.ascii_letters + string.digits, k=n))

range_ = 5

smp_dict = {}
key_list = []
for i in range(range_):
    key = randomname(10)
    smp_dict[key] = randomname(20)
    key_list.append(key)

# if文作成
for i in range(range_):
    if i == 0:
        print("      if key == '{}':".format(key_list[i]))
    else :
        print("      elif key == '{}':".format(key_list[i]))
    print("          content = '{}'".format(smp_dict[key_list[i]]))

위에서 출력한 if문을 copipe로 하여 검증용 코드 작성
rnd_key_list = smp_dict.keys()

time_list = []
for i in range(100):
    start = time.time()
    for key in rnd_key_list:
        if key == 's9MT4kkqyg':
            content = 'JpNeK8tDV1FyQfXdzTS0'
        elif key == 'PKFEikSHFM':
            content = 'RxhZqdfsCqLTuxBzIrdV'
        elif key == '04Ex4druSy':
            content = 'GmT0Jx78xPuMrOyVPuik'
        elif key == 'JUJ85l8ayb':
            content = 'xVtzS0HnHHEOHML87z85'
        elif key == 'HnqyHAIcLm':
            content = 'NRNoem9JpGUcFxvccaxD'
    time_list.append(elapsed_time)
if_mean = mean(time_list)
print ("if Mean time:{}".format(if_mean) + "[sec]")


time_list = []
for i in range(100):
    start = time.time()
    Smp_dict = {'s9MT4kkqyg': 'JpNeK8tDV1FyQfXdzTS0', 'PKFEikSHFM': 'RxhZqdfsCqLTuxBzIrdV', '04Ex4druSy': 'GmT0Jx78xPuMrOyVPuik', 'JUJ85l8ayb': 'xVtzS0HnHHEOHML87z85', 'HnqyHAIcLm': 'NRNoem9JpGUcFxvccaxD'}
    for key in rnd_key_list:
        content = Smp_dict[key]
    elapsed_time = time.time() - start
    time_list.append(elapsed_time)
dict_mean = mean(time_list)
print ("dict Mean time:{}".format(dict_mean) + "[sec]")

검증 코드 해설


smp_dict = {}
key_list = []
for i in range(100):
    key = randomname(10)
    smp_dict[key] = randomname(20)
    key_list.append(key)

->
랜덤한 10문자를 키로, 마찬가지로 랜덤한 20문자를 밸류로 한 사전형&키리스트를 작성
rnd_key_list = smp_dict.keys()

->
사전 형식을 만들 때 순서는 유지되지 않으므로 조건을 동일하게 만들기 위해 새 키 목록을 만들 수 있습니다.
@shiracamus 씨로부터 최근에는 유지한다고의 코멘트 받았습니다!
start = time.time()
Smp_dict = {'BGM85yImoJ': 'i5GozNMNXGdfrlVgmVA0', ...}

->
측정을 시작한 후 사전 형식을 읽습니다.

참고



【Python】 처리에 걸리는 시간을 측정하여 표시
Python을 사용하여 임의의 문자열 생성

좋은 웹페이지 즐겨찾기