IT이야기

사전은 Python 3.6+로 주문되었는가?

cyworld 2022. 3. 21. 09:03
반응형

사전은 Python 3.6+로 주문되었는가?

사전은 이전 수감과 달리 파이톤 3.6(적어도 CPython 구현에 따라)에서 주문된다.이것은 상당한 변화처럼 보이지만, 설명서의 짧은 단락에 불과하다.그것은 언어 기능이 아닌 CPython 구현 세부사항으로 설명되지만, 또한 이것이 미래에 표준이 될 수도 있다는 것을 암시한다.

새로운 사전 구현이 요소 순서를 보존하면서 어떻게 이전 사전보다 더 잘 수행되는가?

다음은 설명서의 텍스트:

dict()이제 PyPy가 개척한 "컴팩트" 표현을 사용한다.새로운 명령()의 메모리 사용량은 Python 3.5에 비해 20%~25% 정도 적다. PEP 468(함수에 **kwrgs의 순서를 보존함)은 이것에 의해 구현된다.이 새로운 구현의 주문 보존 측면은 구현 세부사항으로 간주되며, 신뢰할 수 없다(이것은 미래에 변경될 수 있지만, 언어 규격을 변경하기 전에 현재와 미래의 모든 피틴에 대해 주문 보존 의미론을 요구하기 전에 몇 가지 릴리스 동안 언어에서 이 새로운 명령 구현을 수행하도록 하는 것이 바람직하다).구현 시; 이것은 또한 무작위 반복 순서가 여전히 유효한 이전 버전의 언어(예: Python 3.5)와의 역호환성을 보존하는 데 도움이 된다. (이나다 나오키(INADA Naoki) 발행 27350.원래 레이먼드 헤팅거가 제안한 아이디어.)

2017년 12월 업데이트:dicts Python 3.7에 대한 삽입 순서 유지 보장

사전은 Python 3.6+로 주문되었는가?

그들은 삽입 명령[1] 받았다.파이톤 3.6을 기준으로 파이썬의 CPython 구현을 위해 사전은 삽입된 항목의 순서를 기억한다.이는 Python 3.6에서 구현 세부사항으로 간주되며, 다음을 사용하십시오.OrderedDictPython의 다른 구현(및 기타 순서 동작[1])에서 보장되는 삽입 순서를 원할 경우.

Python 3.7에서, 이것은 더 이상 구현 세부사항이 아니며 대신에 언어 기능이 된다.GvR의 Python-dev 메시지에서:

그렇게 해 주세요."독일이 삽입 순서를 지킨다"는 판결이 나왔다.고마워!

이것은 단순히 의지할 수 있다는 것을 의미한다.Python의 다른 구현도 Python 3.7의 적절한 구현을 원한다면 삽입 순서 사전을 제공해야 한다.


파이톤은 어떤가?3.6사전 구현이 요소 순서를 보존하면서 이전 구현보다 더 잘[2] 수행되는가?

기본적으로, 두 의 배열을 유지함으로써.

  • 첫 번째 배열은 삽입된 순서대로 사전에 대한 항목(유형 )을 보관한다.순서 보존은 항상 마지막에 새 항목이 삽입되는 추가 전용 배열(삽입 순서)으로 이루어진다.

  • 둘째, 는 에 대한 지수를 보유한다.dk_entries 배열(즉, 해당의 나)에서 값)은 값이다.dk_entries이 배열은 해시 테이블 역할을 한다.키를 해시하면 에 저장된 지수 중 하나로 이어진다.dk_indices해당 항목이 인덱싱에 의해 가져오기됨dk_entries. 인덱스만 유지되기 때문에 이 배열의 유형은 사전의 전체 크기(유형별 범위)에 따라 달라진다.1바이트) ~ int64_t()4/8(바이트)에 대한32/64비트 빌드)

이전 구현에서는 유형이 희박하게 배열되어 있음PyDictKeyEntry크기 및 크기dk_size그은 할당되어야 한다. 도어도, 그한 한국 많을라다보다 에 빈 생겼다. 왜냐하면 그 배열이 그 이상일 수 없었기 때문이다.2/3 * dk_size성능상의 이유로 가득 찬(그리고 그 빈 공간은 여전히 가지고 있었다.PyDictKeyEntry크기!).

필요한 항목(삽입된 항목)만 저장되고 유형이 희박하게 배열되기 때문에 지금은 그렇지 않다.intX_t(X명령어 크기에 따라)2/3 * dk_sizes는 가득하다.빈 공간이 유형에서 변경됨PyDictKeyEntryintX_t.

그래서, 분명히, 희박한 종류의 배열을 만드는 겁니다.PyDictKeyEntry저장하기 위한 스파스 배열보다 훨씬 더 많은 메모리 요구ints

이 기능에 관한 Python-Dev에서 흥미있는 모든 대화를 볼 수 있다. 그것은 좋은 읽을거리다.


레이먼드 헤팅거가 제안한 원안에서는, 아이디어의 요지를 포착하는 데이터 구조의 시각화를 볼 수 있다.

예를 들어 사전:

d = {'timmy': 'red', 'barry': 'green', 'guido': 'blue'}

현재 [keyhash, key, value]로 저장됨:

entries = [['--', '--', '--'],
           [-8522787127447073495, 'barry', 'green'],
           ['--', '--', '--'],
           ['--', '--', '--'],
           ['--', '--', '--'],
           [-9092791511155847987, 'timmy', 'red'],
           ['--', '--', '--'],
           [-6480567542315338377, 'guido', 'blue']]

대신 데이터는 다음과 같이 정리해야 한다.

indices =  [None, 1, None, None, None, 0, None, 2]
entries =  [[-9092791511155847987, 'timmy', 'red'],
            [-8522787127447073495, 'barry', 'green'],
            [-6480567542315338377, 'guido', 'blue']]

지금 보시다시피, 원래의 제안에서는 충돌을 줄이고 더 빨리 찾기 위해 많은 공간이 기본적으로 비어 있다.새로운 접근 방식을 사용하면 인덱스에서 정말로 필요한 범위 내에서 이동함으로써 필요한 메모리를 줄일 수 있다.


[1]: "주문"이 아닌 "주문"은 "주문"의 존재와 함께 "주문"은 "독점"의 개체가 *제공하지 않는 추가적인 행동을 암시하기 때문에 "주문"이라고 말한다.OrderDicts는 되돌릴 수 있고, 질서에 민감한 방법을 제공하며, 주로 질서에 민감한 평등 테스트("="=", "!=")를 제공한다.현재 dict은 그런 행동과 행동을 전혀 제공하지 않는다.
[2]: 새로운 사전 구현은 보다 간결하게 설계되어 **메모리 현명한**을 더 잘 구현한다. 이것이 바로 여기서의 주요 이점이다.속도 현명한, 차이는 그렇게 크지 않지만, 새로운 명령어가 약간의 퇴행(를 들어 키 검색)을 도입할 수 있는 반면, 다른 명령어에서는 (반복 및 크기 조정) 성능 향상이 있어야 한다. 전반적으로, 특히 실생활에서의 사전의 성능은 도입된 콤팩트함 때문에 향상된다.

아래는 원래 첫 번째 질문에 대한 대답이다.

사용할까dict또는OrderedDict파이톤 3.6에서?

내 생각에 이 설명서의 문장은 사실 당신의 질문에 답하기에 충분하다.

이 새로운 구현의 주문 보존 측면은 구현 세부사항으로 간주되므로 신뢰할 수 없다.

dict주문된 컬렉션은 명시적으로 의도된 것이 아니므로 일관성을 유지하고 새로운 구현의 부작용에 의존하지 않으려면 다음 사항을 준수하십시오.OrderedDict.

코드를 미래의 증명으로 만드십시오.

여기서 그것에 대한 논쟁이 있다.

편집: Python 3.7은 이것을 특징으로 유지한다. 참조

업데이트: Guido van Rossum이 Python 3.7을 기준으로 메일링 리스트에 공지함dict모든 Python 구현에서 s 삽입 순서를 유지해야 한다.

나는 위의 토론에 더하고 싶었지만 평판이 좋지 않다.

3은 Python 3.8을 한다.reversed()사전의 와 또 )OrderedDict.

받아쓰기 및 받아쓰기는 이제 역()을 사용하여 역 삽입 순서로 반복할 수 있다.(bpo-33462에서 Rémi Lapeyre가 작성함)Python 3.8의 새로운 기능 보기

평등 운영자나 다른 특징에 대한 언급은 전혀 보이지 않는다.OrderedDict그래서 그들은 여전히 완전히 같지는 않다.

2020년에 이 질문에 완전히 답하기 위해 Python 공식 문서의 몇 가지 문장을 인용해보겠다.

버전 3.7에서 변경됨: 사전 순서는 삽입 순서가 보장됨.이 동작은 3.6부터 CPython의 구현 세부사항이었다.

버전 3.7에서 변경됨: 사전 순서는 삽입 순서가 보장됨.

버전 3.8에서 변경됨: 사전은 이제 되돌릴 수 있다.

사전과 사전은 되돌릴 수 있다.

OrderDict 대 받아쓰기 관련 문장:

주문형 사전은 일반 사전과 같지만 주문 작업과 관련된 몇 가지 추가 기능을 가지고 있다.내장된 받아쓰기 클래스가 삽입 순서를 기억할 수 있는 능력을 얻었기 때문에(이 새로운 동작은 파이썬 3.7에서 보증되었다) 그것들은 덜 중요해졌다.

참조URL: https://stackoverflow.com/questions/39980323/are-dictionaries-ordered-in-python-3-6

반응형