파이썬 사전에서 'has_key ()'또는 'in'을 사용해야합니까?
무엇을하는 것이 더 나은지 궁금합니다.
d = {'a': 1, 'b': 2}
'a' in d
True
또는:
d = {'a': 1, 'b': 2}
d.has_key('a')
True
in
확실히 더 비단뱀 적입니다.
실제로 has_key()
Python 3.x에서 제거되었습니다 .
in
우아함 (그리고 더 이상 사용되지 않음 ;-)뿐만 아니라 성능면에서도 손을 뗄 수 있습니다. 예 :
$ python -mtimeit -s'd=dict.fromkeys(range(99))' '12 in d'
10000000 loops, best of 3: 0.0983 usec per loop
$ python -mtimeit -s'd=dict.fromkeys(range(99))' 'd.has_key(12)'
1000000 loops, best of 3: 0.21 usec per loop
다음 관찰이 항상 사실 은 아니지만 일반적으로 Python에서는 더 빠른 솔루션이 더 우아하고 Pythonic이라는 것을 알 수 있습니다. 그게 -mtimeit
도움이되는 이유 입니다. 여기저기서 100 나노초 만 절약하는 것이 아닙니다 !-)
파이썬 문서 에 따르면 :
has_key()
대신 사용되지 않습니다key in d
.
dict.has_key()
2.3 이전의 Python 버전 ( key in dict
출시 된 경우)에서 코드를 실행해야하는 경우에만 사용 합니다 .
in
실제로 성능을 저하시키는 한 가지 예가 있습니다.
당신이 사용하는 경우 in
에만 구현하는 O에 (1) 컨테이너 __getitem__
및 has_key()
하지만,하지 __contains__
(당신은 O (1)는 O (N) 검색으로 검색 바뀝니다 in
통해 선형 검색을 다시 떨어진다 __getitem__
).
수정은 분명히 사소한 것입니다.
def __contains__(self, x):
return self.has_key(x)
has_key
은 사전 메서드이지만 in
모든 컬렉션에서 작동하며, __contains__
누락 된 in
경우에도 다른 메서드를 사용하여 컬렉션을 반복하여 알아냅니다.
dict.has_key ()에 대한 솔루션은 더 이상 사용되지 않습니다. 'in'사용-숭고한 텍스트 편집기 3
여기에 'ages'라는 사전의 예를 들었습니다.
ages = {}
# Add a couple of names to the dictionary
ages['Sue'] = 23
ages['Peter'] = 19
ages['Andrew'] = 78
ages['Karren'] = 45
# use of 'in' in if condition instead of function_name.has_key(key-name).
if 'Sue' in ages:
print "Sue is in the dictionary. She is", ages['Sue'], "years old"
else:
print "Sue is not in the dictionary"
Expanding on Alex Martelli's performance tests with Adam Parkin's comments...
$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' 'd.has_key(12)'
Traceback (most recent call last):
File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/timeit.py", line 301, in main
x = t.timeit(number)
File "/usr/local/Cellar/python3/3.5.2_3/Frameworks/Python.framework/Versions/3.5/lib/python3.5/timeit.py", line 178, in timeit
timing = self.inner(it, self.timer)
File "<timeit-src>", line 6, in inner
d.has_key(12)
AttributeError: 'dict' object has no attribute 'has_key'
$ python2.7 -mtimeit -s'd=dict.fromkeys(range( 99))' 'd.has_key(12)'
10000000 loops, best of 3: 0.0872 usec per loop
$ python2.7 -mtimeit -s'd=dict.fromkeys(range(1999))' 'd.has_key(12)'
10000000 loops, best of 3: 0.0858 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' '12 in d'
10000000 loops, best of 3: 0.031 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range(1999))' '12 in d'
10000000 loops, best of 3: 0.033 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range( 99))' '12 in d.keys()'
10000000 loops, best of 3: 0.115 usec per loop
$ python3.5 -mtimeit -s'd=dict.fromkeys(range(1999))' '12 in d.keys()'
10000000 loops, best of 3: 0.117 usec per loop
If you have something like this
t.has_key(ew)
change it to below for running on Python 3.X and above
key = ew
if key not in t
참고URL : https://stackoverflow.com/questions/1323410/should-i-use-has-key-or-in-on-python-dicts
'Program Tip' 카테고리의 다른 글
heroku 코드를 배포 할 때 권한이 거부되었습니다 (공개 키). (0) | 2020.09.28 |
---|---|
쉘 스크립트에서 부울 변수를 선언하고 사용하는 방법은 무엇입니까? (0) | 2020.09.28 |
“git commit”과“git push”의 차이점은 무엇입니까? (0) | 2020.09.28 |
Big O, 어떻게 계산 / 근사화합니까? (0) | 2020.09.28 |
Maven 프로젝트에 로컬 jar 파일을 추가하는 방법은 무엇입니까? (0) | 2020.09.27 |