Как вы думаете, почему звонок с диктофона медленный, кроме ощущения? Лучший (возможно, единственный) способ узнать это - измерить.
Я запустил следующий скрипт:
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 вперед и используйте это.