복붙노트

[PYTHON] 사전 키가 존재하는지 확인하고 그것이 존재한다면 값을 처리하는 가장 효율적인 방법

PYTHON

사전 키가 존재하는지 확인하고 그것이 존재한다면 값을 처리하는 가장 효율적인 방법

MyDict = {'key1':'value1', 'key2':'value2'}

나는이 몇 가지 방법을 사용할 수 있습니다 :

if 'key1' in MyDict:
       var1 = MyDict['key1']

또는

if MyDict.has_key('key1'):
       var1 = MyDict['key1']

또는

if MyDict['key1']:
    var1=MyDict['key1']

해결법

  1. ==============================

    1.당신을위한 작은 벤치 마크 (ipython) :

    당신을위한 작은 벤치 마크 (ipython) :

    In [1]: def test_1(d, k):
       ...:     if k in d:
       ...:         var1 = d[k]
       ...:         
    
    In [2]: def test_2(d, k):
       ...:     if d.has_key(k):
       ...:         var1 = d[k]
       ...:         
    
    In [3]: def test_3(d, k):
       ...:     try:
       ...:         var1 = d[k]
       ...:     except KeyError as e:
       ...:         pass
       ...:     
    
    In [4]: def test_4(d, k):
       ...:     if d.get(k):
       ...:         var1 = d[k]
       ...:         
    
    In [5]: my_dict = {'key{}'.format(i): 'value{}'.format(i) for i in range(1000)}
    
    In [6]: key_valid = "key5"
    
    In [7]: key_non_valid = "key"
    
    In [8]: %timeit test_1(my_dict, key_valid)
    10000000 loops, best of 3: 172 ns per loop
    
    In [9]: %timeit test_1(my_dict, key_non_valid)
    10000000 loops, best of 3: 132 ns per loop
    
    In [10]: %timeit test_2(my_dict, key_valid)
    1000000 loops, best of 3: 211 ns per loop
    
    In [11]: %timeit test_2(my_dict, key_non_valid)
    10000000 loops, best of 3: 171 ns per loop
    
    In [12]: %timeit test_3(my_dict, key_valid)
    10000000 loops, best of 3: 151 ns per loop
    
    In [13]: %timeit test_3(my_dict, key_non_valid)
    1000000 loops, best of 3: 1.07 µs per loop
    
    In [14]: %timeit test_4(my_dict, key_valid)
    1000000 loops, best of 3: 246 ns per loop
    
    In [15]: %timeit test_4(my_dict, key_non_valid)
    10000000 loops, best of 3: 189 ns per loop
    

    결론 : dict의 생성 키는 일반적으로 가장 빠르며, 유효한 키의 경우를 제외하고는 try 만 수행하면 성능이 향상됩니다. 작동하는 경우 수행하지 않기 때문입니다.

  2. ==============================

    2.MyDict [ "key1"]이 설정되어있을 때만 var1을 정의하려고한다고 가정하면 var1 = MyDict.get ( "key1", default = some_sentinel_or_default_value)입니다.

    MyDict [ "key1"]이 설정되어있을 때만 var1을 정의하려고한다고 가정하면 var1 = MyDict.get ( "key1", default = some_sentinel_or_default_value)입니다.

    wrt / 공연, 그것은 대부분의 시간에 당신의 사전에 "key1"이있을 것으로 기대하는지 여부에 달려 있습니다. 첫 번째 경우 try / except 블록이 더 빠를 수도 있고, 그렇지 않은 경우 속도가 느려질 수도 있습니다 (실제 예외가있을 때 블록을 설치하는 것은 저렴하지만 비용은 많이 듭니다).

    퍼포먼스에 대해 정말로 걱정한다면, timeit 모듈을 사용하여 실제 데이터에 대한 다양한 옵션을 테스트하는 것이 좋습니다.

  3. ==============================

    3.이 방법은 매우 빠릅니다.

    이 방법은 매우 빠릅니다.

    if 'key1' in MyDict:
           var1 = MyDict['key1']
    

    사전 및 해싱 항목의 특정 조건을 가정 할 때이 값은 평균값이어야합니다. O [1]

  4. from https://stackoverflow.com/questions/28859095/most-efficient-method-to-check-if-dictionary-key-exists-and-process-its-value-if by cc-by-sa and MIT license