Как я могу вызвать функцию для сопоставления ключа в Python? - PullRequest
0 голосов
/ 12 июля 2020
def fin1():
    #some context
    pass

def fin2():
    #some context
    pass

def fin3():
    #some context
    pass

def fin4():
    #some context
    pass

test_dic = {"1": fin1, "2": fin2, "3": fin3, "4": fin4}

some_string = "123123wafds"

result_string = ""
for single_str in some_string:
    if single_str in test_dic:
        test_dic[single_str]()
    else:
        result_string += single_str

Я думал, что сложность создания нескольких, если состояние равно O (logN). Поэтому я называю функцию подходящей для ключа таким образом, потому что я думал, что ее сложность равна O (1), но это кажется медленным. И люди говорят, что это грязно.

Есть ли другой способ приблизиться к случайному совпадению функции с ключом или идентификатором? Или как-нибудь лучше исправить это.

1 Ответ

0 голосов
/ 12 июля 2020

Как вы думаете, почему звонок с диктофона медленный, кроме ощущения? Лучший (возможно, единственный) способ узнать это - измерить.

Я запустил следующий скрипт:

def fin1():
    #some context
    pass

def fin2():
    #some context
    pass

def fin3():
    #some context
    pass

def fin4():
    #some context
    pass

test_dic = {"1": fin1, "2": fin2, "3": fin3, "4": fin4}

def indirect():
    some_string = "123123wafds" * 10000

    result_string = ""
    for single_str in some_string:
        if single_str in test_dic:
            test_dic[single_str]()
        else:
            result_string += single_str

def direct():
    some_string = "123123wafds" * 10000

    result_string = ""
    for single_str in some_string:
        if single_str == "1":
            fin1()
        elif single_str == "2":
            fin2()
        elif single_str == "3":
            fin3()
        elif single_str == "4":
            fin4()

        else:
            result_string += single_str

for i in range(1000):
    indirect()

for i in range(1000):
    direct()

Я использовал модуль cProfile для измерения, например:

$ python3 -m cProfile test_indirect.py 
         120002003 function calls in 33.458 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.001    0.001   33.458   33.458 test_indirect.py:1(<module>)
 40000000    1.941    0.000    1.941    0.000 test_indirect.py:1(fin1)
     1000   12.334    0.012   15.150    0.015 test_indirect.py:19(indirect)
     1000   15.360    0.015   18.307    0.018 test_indirect.py:29(direct)
 40000000    1.936    0.000    1.936    0.000 test_indirect.py:5(fin2)
 40000000    1.886    0.000    1.886    0.000 test_indirect.py:9(fin3)
        1    0.000    0.000   33.458   33.458 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

Как показывают результаты, косвенный (с использованием dict) быстрее прямого (с использованием if / elif). Так что go вперед и используйте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...