大多数 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
这是 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