Эта статья была впервые опубликована вЗнай почти
Мы знаем, что в python нет оператора switch, поэтому, когда мы хотим реализовать логику такой структуры:
var index = 10
switch index {
case 100 :
print( "index 的值为 100")
case 10,15 :
print( "index 的值为 10 或 15")
case 5 :
print( "index 的值为 5")
default :
print( "默认 case")
}
Часто для достижения нужно использовать несколько if-else. Кроме того, мы также можем рассмотреть способ извлечения соответствующего словаря.Ниже мы даем четыре метода для реализации переключателя и сравниваем время работы этих четырех методов.
something = 'something'
# 第一种,多次使用if-else结构
if something == 'this':
the_thing = 1
elif something == 'that':
the_thing = 2
elif something == 'there':
the_thing = 3
else:
the_thing = 4
# 第二种,用get设置默认值的字典提取
options = {'this': 1, 'that': 2, 'there': 3}
the_thing = options.get(something, 4)
# 第三种,用if-else配合不设置默认值的字典提取
options = {'this': 1, 'that': 2, 'there': 3}
if something in options:
the_thing = options[something]
else:
the_thing = 4
# 第四种,用collections模块设置默认值进行字典提取
from collections import defaultdict
default_options = defaultdict(lambda: 4, {'this': 1, 'that': 2, 'there': 3})
the_thing = default_options[something]
Давайте сравним скорость этих методов и разделим их на два случая.
- Содержание решения есть в словаре
- Содержание решения отсутствует в словаре
Введите следующее в файл ifelse.py
import time
from collections import defaultdict
# 计算运行时间的装饰器
def run_time(func):
def wrapper(*args, **kw):
start = time.time()
func(*args, **kw)
end = time.time()
print('running', end-start, 's')
return wrapper
# 准备好两个字典
options = {'this': 1, 'that': 2, 'there': 3}
default_options = defaultdict(lambda: 4, {'this': 1, 'that': 2, 'there': 3})
# 四种方法都定义成函数
# 接受参数something即待判断值
# 每次循环10000000次
@run_time
def first(something):
for i in range(10000000):
if something == 'this':
the_thing = 1
elif something == 'that':
the_thing = 2
elif something == 'there':
the_thing = 3
else:
the_thing = 4
@run_time
def second(something):
for i in range(10000000):
the_thing = options.get(something, 4)
@run_time
def third(something):
for i in range(10000000):
if something in options:
the_thing = options[something]
else:
the_thing = 4
@run_time
def forth(something):
for i in range(10000000):
the_thing = default_options[something]
# 调用函数
if __name__ == '__main__':
# 判断的内容不在字典中
first('something')
second('something')
third('something')
forth('something')
print('-'*20)
# 判断的内容在字典中
first('this')
second('this')
third('this')
forth('this')
Запустить несколько раз в командной строке
python ifelse.py
Результат выглядит следующим образом
-------------第一次---------------
running 1.8487958908081055 s
running 1.63755202293396 s
running 0.7807505130767822 s
running 0.6786513328552246 s
--------------------
running 0.7807483673095703 s
running 2.075996160507202 s
running 1.0349910259246826 s
running 0.740731954574585 s
-------------第二次---------------
running 1.7757258415222168 s
running 1.6395549774169922 s
running 0.8408102989196777 s
running 0.7977871894836426 s
--------------------
running 0.710662841796875 s
running 1.9098539352416992 s
running 1.042982578277588 s
running 0.8197875022888184 s
-------------第三次---------------
running 1.5885050296783447 s
running 1.8237719535827637 s
running 0.9819226264953613 s
running 0.78375244140625 s
--------------------
running 0.6226155757904053 s
running 1.634549617767334 s
running 0.947911262512207 s
running 0.6586313247680664 s
Как видно из результатов 1. Сравнение четырех методов: последние два метода явно быстрее первых двух, а последний метод всегда самый быстрый. 2. Сравнение того, установлен ли оцениваемый контент в словаре.
- В первом случае целостного суждения «если-иначе» программа завершится раньше, если она будет оценена раньше, поэтому порядок содержимого суждения «если-иначе» будет особенным.
- Извлечение из словаря не показало существенной разницы
Поскольку defaultdict в модуле collections является самым быстрым, но требует больше памяти, наиболее рекомендуемым является третий метод, использующий if-else без метода извлечения словаря по умолчанию.
Ссылаться наЭтот ответ на stackoverflow
Добро пожаловать, чтобы обратить внимание на мою колонку знаний
Главная страница колонки:программирование на питоне
Каталог столбцов:содержание
Примечания к выпуску:Примечания к выпуску программного обеспечения и пакетов