понимание списка vs filter () vs разница наборов: что наиболее эффективно при фильтрации набора? - PullRequest
0 голосов
/ 09 мая 2020

Учитывая, что у меня есть:

  • 1 массив целых чисел, преобразованных как набор (с именем neighbors)

  • 3 других набора целые числа, которых следует избегать (с именами forbidden1, forbidden2 и forbidden3)

__

neighbors = {6, 12, 9}
forbidden1 = {1, 4, 7, 8}
forbidden2 = {2, 5, 0, 3}
forbidden3 = {6, 9}

__

Какие из следующих решения будут наиболее эффективными при отфильтровывании запрещенных значений из первого набора? И почему?

A / понимание списка с помощью if оператора и логических операторов and

[x for x in neighbors if x not in forbidden1 and x not in forbidden2 and x not in forbidden3]

B / понимание списка с if операторы оператора и объединения |

[x for x in neighbors if x not in forbidden1 | forbidden2 | forbidden3]

C / filter () с логическими операторами and

filter(lambda x: x not in forbidden1 and x not in forbidden2 and x not in forbidden3, neighbors)

D / filter () с операторами объединения |

filter(lambda x: x not in forbidden1 | forbidden2 | forbidden3, neighbors)

E / установить разницу с операторами объединения |

neighbors.difference(forbidden1 | forbidden2 | forbidden3)

1 Ответ

0 голосов
/ 09 мая 2020

Пробовал (timeit python):

A) 294 ns ± 28.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
B) 297 ns ± 26.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
C) 300 ns ± 31.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
D) 294 ns ± 19.8 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
E) 291 ns ± 21.2 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

Все примерно одинаково.

...