【发布时间】:2021-09-29 05:55:45
【问题描述】:
我期待 Python match/case 对每个案例都有相同的时间访问,但似乎我错了。有什么好的解释吗?
让我们使用以下示例:
def match_case(decimal):
match decimal:
case '0':
return "000"
case '1':
return "001"
case '2':
return "010"
case '3':
return "011"
case '4':
return "100"
case '5':
return "101"
case '6':
return "110"
case '7':
return "111"
case _:
return "NA"
并定义一个快速测量时间的工具:
import time
def measure_time(funcion):
def measured_function(*args, **kwargs):
init = time.time()
c = funcion(*args, **kwargs)
print(f"Input: {args[1]} Time: {time.time() - init}")
return c
return measured_function
@measure_time
def repeat(function, input):
return [function(input) for i in range(10000000)]
如果我们在每个案例中运行每个10000000 次,则时间如下:
for i in range(8):
repeat(match_case, str(i))
# Input: 0 Time: 2.458001136779785
# Input: 1 Time: 2.36093807220459
# Input: 2 Time: 2.6832823753356934
# Input: 3 Time: 2.9995620250701904
# Input: 4 Time: 3.5054492950439453
# Input: 5 Time: 3.815168857574463
# Input: 6 Time: 4.164452791213989
# Input: 7 Time: 4.857251167297363
只是想知道为什么访问时间不同。这不是用查找表优化的吗?请注意,我对访问时间相等的其他方式(即使用字典)不感兴趣。
【问题讨论】:
-
匹配/案例代码甚至不是 python...
-
@Jab 这是 Python 3.10。
-
你的期望是错误的。这不是原始数据类型的切换案例。它用于模式匹配。它是*不是开关
-
还有优化空间(对于所有文字模式,我怀疑可以构建一个查找表),但目前它似乎没有优化。跨度>
-
使用哈希/索引对此进行优化需要编译器事先知道每个案例值的数据类型(即仅适用于常量)。那将是一个非常狭窄的特殊情况。考虑到目标是模式匹配,而不是语句调度,我怀疑是否需要付出额外的努力。
标签: python python-3.x switch-statement match