大多数 time/space 检查整数列表中的所有元素是否为 0 的有效方法

Most time/space efficient way to check if all elements in list of integers are 0

这是 Python 2.7

的实现问题

假设我有一个名为 nums 的整数列表,我需要检查 nums 中的所有值是否都为零。 nums 包含很多元素(即超过 10000 个),有很多重复值。

使用all():

if all(n == 0 for n in set(nums)):  # I assume this conversion from list to set helps?
    # do something

使用集合减法:

if set(nums) - {0} == set([]):
    # do something

编辑:执行上述方法的更好方法,由用户 U9-Forward 提供

if set(nums) == {0}:
    # do something

每种方法的时间和 space 复杂性如何比较?有没有更有效的方法来检查这个?

注意:对于这种情况,我尽量避免使用 numpy/pandas。

nums 的任何集合转换都无济于事,因为它会遍历整个列表:

if all(n == 0 for n in nums):
    # ...

很好,因为它在第一个非零元素处停止,忽略其余部分。

渐近地,所有这些方法都与随机数据呈线性关系。 实现细节(生成器上没有重复的函数调用)使 not any(nums) 更快,但这依赖于不存在任何其他虚假元素,但 0,例如''None

如果你会用 numpy,那么 (np.array(nums) == 0).all() 应该会用。

除了@schwobaseggl 的回答,第二个例子可能更好:

if set(nums)=={0}:
    # do something

not any(nums) 可能是最快的,因为它会停止 when/if 它找到任何非零元素。

性能比较:

a = range(10000)
b = [0] * 10000
%timeit not any(a) # 72 ns, fastest for non-zero lists
%timeit not any(b) # 33 ns, fastest for zero lists
%timeit all(n == 0 for n in a) # 365 ns
%timeit all(n == 0 for n in b) # 350 µs
%timeit set(a)=={0} # 228 µs
%timeit set(b)=={0} # 58 µs