Вопрос по performance, python, indexing – оператор Python, нет оператора для «не в»

17

Это возможно глупый вопрос, но, глядя наотображение операторов на функции Я заметил, что нет функции для выраженияnot in оператор. Сначала я подумал, что это, вероятно, потому, что переводчик просто переставляет этоnot x in y, но есть функция дляis not кажется, что он должен вести себя точно так же, какnot in, Я что-то упустил или этот оператор действительно не существует?

Вот действительно глупый пример, где вы можете захотеть это:

def compare_iter(a,b,func):
    return [func(aa,bb) for aa,bb in zip(a,b)]

my_compare=compare_iter(xx,yy,lambda x,y:x not in y)  #lambda -- yuck
my_compare=map(operator.not_,compare_iter(xx,yy,operator.contains)  #extra map?  grr...
#it would be nice to do: my_compare=compare_iter(xx,yy,operator.not_contains)

Конечно, я мог бы написать свою собственную функцию для этого, но тогда вы заплатите цену за эффективность, тогда как модуль оператора может вытолкнуть этот код из python и, следовательно, выполнить быстрее.

@PaulManta сомнительно, так какnot in по определению это исчерпывающий поиск. Colin Dunklau
Действительно, не могa is not b просто переупорядочитьnot a is b? JAB
@ColinDunklau Не обязательно. Подумайте о таких вещах, как Bloom Filters, где, если только один бит не установлен, вы можете быть уверены, что элемент не был вставлен в набор. Paul Manta
@JAB - Да, это возможно. Но это не главное. Дело в том, что здесь есть какая-то смешная асимметрия. Кажется, должно бытьnot_contains функция, которая затем может быть использована для передачи другим функциям или что-то еще (вместо того, чтобы полагаться наlambda). mgilson
Есть ли ситуация, когда проверка дляnot in потенциально может быть сделано быстрее, чем проверка наin? Paul Manta

Ваш Ответ

2   ответа
15

not in обратная сторонаinИтак, у вас есть следующие сопоставления:

obj in seq => contains(seq, obj)

obj not in seq => not contains(seq, obj)

Вы правы, это не согласуется сis/is not, поскольку тесты на идентичность должны быть симметричными. Это может быть артефакт дизайна.

Размышляя об этом, мне кажется, что другой операторshould быть необходимымx > y не означает (обязательно)not (x <= y) в питоне. Почему тестирование на герметичность должно быть другим? mgilson
3

ператоров:

>>> def test():
        if 0 in (): pass
        if 0 not in (): pass
        if 0 is (): pass
        if 0 is not (): pass
        return None

>>> dis.dis(test)
  2           0 LOAD_CONST               1 (0) 
              3 LOAD_CONST               2 (()) 
              6 COMPARE_OP               6 (in) 
              9 POP_JUMP_IF_FALSE       15 
             12 JUMP_FORWARD             0 (to 15) 

  3     >>   15 LOAD_CONST               1 (0) 
             18 LOAD_CONST               3 (()) 
             21 COMPARE_OP               7 (not in) 
             24 POP_JUMP_IF_FALSE       30 
             27 JUMP_FORWARD             0 (to 30) 

  4     >>   30 LOAD_CONST               1 (0) 
             33 LOAD_CONST               4 (()) 
             36 COMPARE_OP               8 (is) 
             39 POP_JUMP_IF_FALSE       45 
             42 JUMP_FORWARD             0 (to 45) 

  5     >>   45 LOAD_CONST               1 (0) 
             48 LOAD_CONST               5 (()) 
             51 COMPARE_OP               9 (is not) 
             54 POP_JUMP_IF_FALSE       60 
             57 JUMP_FORWARD             0 (to 60) 

  6     >>   60 LOAD_CONST               0 (None) 
             63 RETURN_VALUE         
>>> 

Как видите, в каждом операторе есть разница; и их коды (по порядку): 6, 7, 8 и 9.

Я думаю, более эффективно иметь один байт-код дляnot in а не первые вычисленияin а затем вычислениеnot.
Да, но если вы делаетеnot 0 in ()это переводится как0 not in () - Это заставляет меня еще больше думать, что в модуле оператора должен быть соответствующий оператор,not in явно отличный (и даже предпочтительный) оператор для интерпретатора ... mgilson
@mgilson: Просто заметил это сам. Я подумал, что все будет наоборот, но сейчас я согласен с вашей точкой зрения. Интересно, что я не могу найти никаких обсуждений по поводу включенияnot in как членoperator в официальных списках рассылки Python, несмотря на дискуссию о его полезности.
@JAB, не могли бы вы опубликовать ссылку на некоторые обсуждения о полезности? (Этот вопрос был для меня в основном академическим, я хотел бы посмотреть, что другие люди думают о реальных случаях использования). Есть ли способ попросить его добавить? mgilson

Похожие вопросы