Наиболее эффективный способ проверить время, если все элементы в списке целых чисел равны 0 - PullRequest
0 голосов
/ 26 ноября 2018

Это вопрос реализации для 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

Как сложность времени и пространства сравнивается для каждого из этих подходов?Есть ли более эффективный способ проверить это?

Примечание: для этого случая я стараюсь избегать использования numpy / pandas.

Ответы [ 4 ]

0 голосов
/ 26 ноября 2018

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
0 голосов
/ 26 ноября 2018

Если вы можете использовать numpy, тогда (np.array(nums) == 0).all() должен это сделать.

0 голосов
/ 26 ноября 2018

В дополнение к ответу @ schwobaseggl, второй пример может быть еще лучше:

if set(nums)=={0}:
    # do something
0 голосов
/ 26 ноября 2018

Любое преобразование набора nums не поможет, поскольку оно будет повторять весь список:

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

просто отлично, так как останавливается на первом ненулевом элементе, игнорируя остаток.

Асимптотически все эти подходы линейны со случайными данными.Детали реализации (без повторных вызовов функций в генераторе) делают not any(nums) еще быстрее, но это зависит от отсутствия каких-либо других ложных элементов, кроме 0, например '' или None.

...