有没有办法可以使用映射或列表理解或任何其他更快的方式来实现下面的代码块,并保持其功能相同?
def name_check(names, n_val):
lower_names = names.lower()
for item in set(n_val):
if item in lower_names:
return True
return False
感谢您的帮助
最佳答案
一个简单的实现是
return any(character in names_lower for character in n_val)
对复杂性的天真的猜测是O(K*2*N)
,其中K
是names
中的字符数, N
是 n_val
中的字符数。我们需要一个“循环”来调用 lower*,一个用于内部理解,一个用于 any
。由于 any
是内置函数,并且我们使用生成器表达式,I would expect it to be faster than your manual loop ,但一如既往,请确定个人资料。
需要明确的是,any
short-circuits ,以便保留行为
实现注意事项
关于使用集合
:您使用集合来减少检查次数的直觉是一个很好的直觉(您也可以将其添加到我上面的表单中) ,但这是一个权衡。在第一个元素短路的情况下,对 set 的额外调用是额外的 N 个步骤来生成集合表达式。如果您最终检查每个项目,这会节省您一些时间。这取决于您的预期输入。如果 n_val
最初是一个可迭代对象,那么您就失去了这种好处并预先分配了所有内存。如果您控制函数的输入,为什么不建议使用没有重复项的列表来调用它(即,在其输入上调用 set()
),并将函数保留为通用函数? p>
<小时/>
*
@Neopolitan 指出 names_lower = names.lower()
应该在循环外调用,正如您最初的实现所调用的那样,否则它可能(将?) 在生成器表达式中被重复调用
关于python - 使带有循环的Python代码块更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37289021/