python - 使带有循环的Python代码块更快

标签 python for-loop list-comprehension

有没有办法可以使用映射或列表理解或任何其他更快的方式来实现下面的代码块,并保持其功能相同?

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),其中Knames中的字符数, Nn_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/

相关文章:

python - 将焦点放在 Tkinter 窗口上(取决于平台?)

python - 使用 'iso-8859-1' 解码字节串是否会引发 UnicodeDecodeError

c - 棘手的 for 循环

python - 列表理解和功能

python - 笨拙的理解清理

Python从另一个字符串列表中减去字符串列表

python - Python 中的动态时间规整

javascript - 编写 Array.every() 函数

javascript - 每个循环中有多个 Google 图表

python - 更高效的matplotlib堆积条形图——如何计算底值