如何解决Min Max之类的函数,如果在Python中的循环内使用条件,则使用if best == None
在需要根据条件搜索最佳元素的函数中(例如最小最大函数:搜索最小或最大),我看到一些(或许多)人检查是否拥有最佳答案的变量是在条件检查的并排循环中没有任何内容。
为说明这一点,让下面的2个源代码:
A)在循环内使用测试is None
:
list_vals = [10,9,8,7,6,5,4,3,2,1]
min_val = None
for val in list_vals:
if min_val is None or val<min_val:
min_val = val
print("min = ",min_val)
B)最好是首先接受元素
list_vals = [10,1]
min_val = list_val[0]
for val in list_vals:
if val<min_val:
min_val = val
print("min = ",min_val)
我的问题是:
- 为什么有些人正在做第一个表格(A)?这是一些好的做法吗?
- 如果使用第一个,则表示每次迭代我们都要检查变量是否为None,我不知道编译器是否对此进行了优化。
要查看此示例的执行时间是否是简单的,我使用
计算了方法 A 和 B 的时间nb = 100000000 # 100_000_000
list_vals = random.sample(range(nb),nb)
- 时间(A)= 24.00 s
- 时间(B)= 19.31 s
我用其他长度重复了测试,结果是一样的,B法比A法更快(相对)分析。
谢谢您的帮助。
编辑一项:假设list_vals不为空。谢谢@0x5453
解决方法
在一般代码中,您可能希望使用任意可迭代变量,而不仅仅是list
,在这种情况下,只有第一种形式才有效(您不能为非序列编制索引)。您可能还需要处理可能为空的输入(A通过产生None
来处理它们,而B则产生IndexError
)。它确实增加了非零成本(CPython仅具有最简单,最本地化的优化器;它无法像“ min_val
在第一个循环中仅None
那样进行广泛的推论”)。如果性能至关重要,则可以通过以下两种方式(虽然代码稍显丑陋)获得两全其美的效果:
vals = ... could be any iterable ...
iter_vals = iter(vals) # Explicitly convert to iterator (if already an iterator,just returns vals at trivial cost)
min_val = next(iter_vals,None) # Pulls first value,or None if vals was empty
for val in iter_vals: # Iterates rest of values looking for minimum
if val < min_val:
min_val = val
print("min = ",min_val)
在这种情况下,您无需假设输入是一个序列,不需要制作不必要的数据副本(切片list_vals[1:]
可以做到),也不必为最初的情况是因为您可以安全地获取第一个元素一次,并且无需针对自身测试初始值(因为有状态迭代器仅生成一次初始值)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。