Интересно, что лучше сделать:
d = {'a': 1, 'b': 2}
'a' in d
True
или:
d = {'a': 1, 'b': 2}
d.has_key('a')
True
python
dictionary
igorgue
источник
источник
keys()
это просто набор-подобный вид словаря, а не его копия,x in d.keys()
как и O (1). Тем не менее,x in d
более Pythonic.x in d.keys()
должен создать и уничтожить временный объект, в комплекте с распределением памяти, которое влечет за собой, гдеx in d.keys()
просто делает арифметическую операцию (вычисление хеша) и делает поиск. Обратите внимание, чтоd.keys()
это примерно в 10 раз больше, чем на самом деле. Я не проверял, но я все еще уверен, что это только O (1).in
выигрывает, не только в элегантности (и не устаревшей ;-), но и в производительности, например:Хотя следующее наблюдение не всегда верно, вы заметите, что обычно в Python более быстрое решение более элегантно и Pythonic; вот почему
-mtimeit
ТАК полезно - это не просто экономия сотен наносекунд здесь и там! -)источник
has_key
Похоже, O (1) тоже.Согласно документации по питону :
источник
has_key()
теперь удален в Python 3Используйте,
dict.has_key()
если (и только если), ваш код должен быть запущен версиями Python ранее 2.3 (когда онkey in dict
был представлен).источник
Есть один пример, где на
in
самом деле убивает вашу производительность.Если вы используете
in
на O (1) контейнер , который реализует только__getitem__
и ,has_key()
но не__contains__
вы Превратить O (1) поиск в поиск O (N) (какin
возвращается к линейному поиску через__getitem__
).Исправление очевидно тривиально:
источник
has_key()
является специфическим для Python 2 словарей .in
/__contains__
является правильным API для использования; для тех контейнеров, где полное сканирование неизбежно, в любом случае нет никакогоhas_key()
метода , и если есть подход O (1), то это будет зависеть от варианта использования, и поэтому разработчик должен выбрать правильный тип данных для проблемы.has_key
это словарный метод, но онin
будет работать с любой коллекцией, и даже если__contains__
он отсутствует,in
будет использовать любой другой метод для итерации коллекции, чтобы выяснить это.источник
in
тесты наrange
объектах. Однако я не уверен в его эффективности на Python 2xrange
. ;)__contains__
может тривиально вычислить, находится ли значение в диапазоне или нет.range
экземпляра каждый раз. При использовании одного ранее существующего экземпляра тест "целое число в диапазоне" выполняется примерно на 40% быстрее.Решение dict.has_key () устарело, используйте 'in' - превосходный текстовый редактор 3
Здесь я взял пример словаря под названием «возраст» -
источник
Расширяя тесты производительности Алекса Мартелли с комментариями Адама Паркина ...
источник
Если у вас есть что-то вроде этого:
измените его на ниже для работы на Python 3.X и выше:
источник
t.has_key(ew)
возвращает,True
если значениеew
ссылки также является ключом в словаре.key not in t
возвращает,True
если значение отсутствует в словаре. Более того,key = ew
псевдоним очень, очень избыточен. Правильное написаниеif ew in t
. Вот что уже сказал вам принятый ответ за 8 лет до этого.