Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查整数列表中的所有元素是否为0的最节省时间/空间的方法_Python_Python 2.7_Python 2.x - Fatal编程技术网

Python 检查整数列表中的所有元素是否为0的最节省时间/空间的方法

Python 检查整数列表中的所有元素是否为0的最节省时间/空间的方法,python,python-2.7,python-2.x,Python,Python 2.7,Python 2.x,这是Python 2.7的一个实现问题 假设我有一个名为nums的整数列表,我需要检查nums中的所有值是否都等于零nums包含许多元素(即超过10000个),其中包含许多重复值 使用all(): 使用集合减法: if set(nums) - {0} == set([]): # do something 编辑:做上述方法的更好方式,由用户U9转发 if set(nums) == {0}: # do something 这些方法的时间和空间复杂性如何比较?有没有更有效的方法来检

这是Python 2.7的一个实现问题

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

使用
all()

使用集合减法:

if set(nums) - {0} == set([]):
    # do something
编辑:做上述方法的更好方式,由用户U9转发

if set(nums) == {0}:
    # do something
这些方法的时间和空间复杂性如何比较?有没有更有效的方法来检查这一点


注意:在这种情况下,我试图避免使用numpy/pandas。

任何
nums
的集合转换都不会有帮助,因为它会迭代整个列表:

if all(n == 0 for n in nums):
    # ...
它在第一个非零元素处停止,忽略其余元素

渐近地,所有这些方法都是线性随机数据。
实现细节(在生成器上没有重复的函数调用)使
not any(nums)
更快,但这取决于没有任何其他错误元素,而是
0
,例如
'
None

任何
nums
的集合转换都不会有帮助,因为它会迭代整个列表:

if all(n == 0 for n in nums):
    # ...
它在第一个非零元素处停止,忽略其余元素

渐近地,所有这些方法都是线性随机数据。
实现细节(在生成器上没有重复的函数调用)使
not any(nums)
更快,但这取决于没有任何其他错误元素,而是
0
,例如
'
None

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

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

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

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

除了@schwobasegll的答案之外,第二个例子可能更好:

if set(nums)=={0}:
    # do something
not any(nums)
可能是最快的,因为它会在找到任何非零元素时停止

性能比较:

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
not any(nums)
可能是最快的,因为它会在找到任何非零元素时停止

性能比较:

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

第二个可能更好:
set(nums)={0}
Second可能更好:
set(nums)={0}
这不太可能有帮助,因为创建数组需要完全读取列表。这不太可能有帮助,因为创建数组需要完全读取列表。事实上,
all
@schwobasegl,你的解决方案比我的慢10倍-因为生成器。这是一个正确的观点,但这并不能使你的论点更加正确。让我们+1,因为你的计时看起来不错。(我自己也在计时,但你也打败了我)。但是“all()”并不能提供正确的解决方案。all([0])返回false,其中所有元素都为零,true是正确的。不能只在前面添加“not”,因为all([0,1])也会返回false,这是正确的。如果你仔细想想,你就会意识到“所有”都不是正确的测试。你所有的其他测试看起来都很好。因此,
All
@schwobasegll事实上,你的解决方案比我的慢10倍——因为生成器。这是一个有效的观点,但这并不能使你的论点更加正确。让我们来看看+1,因为你的计时看起来不错。(我自己也在计时,但你也打败了我)。但是“all()”并不能提供正确的解决方案。all([0])返回false,其中所有元素都为零,true是正确的。不能只在前面添加“not”,因为all([0,1])也会返回false,这是正确的。如果你仔细想想,你就会意识到“所有”都不是正确的测试。所有其他测试看起来都不错。通过消除显式比较和生成器,可以获得x10加速。nums同时包含0(int)和0.0(float)的情况如何?
没有任何(nums)
所有(nums)
仍能正常工作吗?通过消除显式比较和生成器,可以获得x10加速。如果nums同时包含0(int)和0.0(float),情况如何?
没有任何(NUM)
所有(NUM)
仍能正常工作吗?