Python에서 해시 가능한 유형은 무엇입니까?


최상의 답변

python에서 해시 가능한 유형을 이해하려면 해싱이 무엇이며 왜 사용되는지 이해해야합니다. 해싱에 대한 간략한 개요는 다음과 같습니다.

객체를 해시한다는 것은 실제로 어떤 기능을 통해 실행하고 있음을 의미합니다. 이 함수를 해시 함수라고합니다. 이 해시 함수가하는 일은 고유 한 입력에 대한 고유 한 출력을 제공하는 것입니다. 예를 들어, hash라는 해시 함수와 a! = b, hash (a)! = hash (b)와 같은 두 개의 변수 a와 b가 있다고 가정 해 보겠습니다. 어쨌든 이론적으로는 다음을 실행합니다. 해시 충돌로. 그것은! = b를 의미하지만 hash (a) == hash (b). 예를 들어 해시 함수가 x mod 10이면 hash (12) == hash (2)입니다. 이를 처리하는 몇 가지 방법이 있습니다.

Python은이를 사전에 키 저장에 사용합니다. 이 작업을 수행하는 방법은 객체를 해시 한 다음 해시를 배열의 인덱스에 매핑 한 다음 여기에 값을 넣는 것입니다. 예를 들어, “123”을 키 “abc”에 저장하고 싶다고 가정 해 봅시다. 파이썬이 사전에 대한 배열을 10으로 초기화했다고 가정 해 봅시다. 파이썬이 할 일은 hash ( abc)와 mod입니다. 사전에 넣으려면 10 씩 올리세요. hash ( abc)가 1234를 반환한다고 가정 해 보겠습니다. Python은이를 10으로 수정하여 4를 얻습니다. 그런 다음 “123”을 인덱스 4에 넣습니다.

따라서 기본적으로 해시 가능한 유형은 파이썬에서 \_\_hash\_\_와 \_\_eq\_\_를 덮어 써서 해시 할 수있는 함수를 만들 수 있습니다.하지만 해시가 같은 객체를 얻을 때마다 같은 것을 반환하는지 확인해야합니다. 당신이 그것을 호출 할 때마다, 당신은 결코 다시는 해시 블에서 당신의 개체를 찾지 못할 것입니다. 동시에 모든 객체에 대해 동일한 것을 반환하고 싶지는 않습니다. 그러면 많은 오 탐지가 발생하기 때문입니다.

물론 이것은 조금 더 복잡하고 이것은 매우 간략한 개요이지만 이것이 해싱의 기본입니다.

Answer

이것은 어려운 질문입니다 (하지만 좋은 질문입니다). 미국 영어에서 질문은 파이썬 언어가 할 수없는 모든 것을 나열으로 읽을 수 있습니다. (저에게는) 그 모든 것을 나열 할만큼 충분히 알지 못하기 때문에 어렵습니다. 아래에 Python이 할 수없는 몇 가지를 나열했습니다. 자세한 내용은 다른 답변을 모두 읽어보세요.

  1. Python은 장치 드라이버에서 작동하지 않습니다. 장치 드라이버는 매우 빠르고 반응성이 높아야합니다. 파이썬도 그런 경향이 없습니다. 장치 드라이버는 독립 실행 형으로 실행되어야합니다. Python에는 대규모 런타임 시스템이 있습니다. Python은 Java와 비슷한 가비지 수집 시스템을 사용합니다. 경우에 따라 가비지 수집을위한 일시 중지가 허용되지 않습니다.
  2. Python은 일부 아주 작은 컴퓨터에서는 사용할 수 없습니다. 일부 컴퓨터 (일반적으로 Arduino와 같은)는 Python에 비해 너무 작습니다. Python에는 일부 컴퓨터에 대해 너무 많은 메모리를 사용하는 런타임 라이브러리가 있습니다. MicroPython이라는 것이 있습니다. 그러나 MicroPython조차도 일부 (매우 작은) 시스템보다 훨씬 더 많은 메모리를 사용합니다. Raspberry Pi는 Python 기반입니다.
  3. Python은 실제로 브라우저에서 실행되지 않습니다. 이 문제에 대한 도구와 솔루션이 있습니다. 그러나 JavaScript는 (지금까지) Python이 아니라 프런트 엔드 프로그래밍을위한 주요 도구입니다.
  4. Python은 이식성이 낮습니다. 실제로 Python은 휴대 성이 뛰어납니다. 그러나 Python 런타임이 이미 설치되어 있어야합니다. 결과적으로 대부분의 게임은 Python으로 작성되지 않습니다. Python 런타임을 설치하는 것은 많은 애플리케이션에서 너무 많은 장애물입니다. 이 점에서 Python은 Java와 매우 유사합니다. Java는 실제로 매우 이식성이 뛰어납니다. 그러나 JVM이 이미 설치되어 있어야합니다.
  5. Python은 일부 용도로는 너무 느립니다. 게임에는 매우 까다로운 FPS 요구 사항이 있으며 방대한 수의 픽셀을 처리해야합니다. 결과적으로 대부분의 게임은 Python이 아닌 C / C ++로 작성됩니다. 평균적으로 Python은 C ++보다 약 100 배 느립니다. 대부분의 경우 (실제로는) 그다지 문제가되지 않습니다. 게임 및 기타 애플리케이션의 경우 그렇습니다.
  6. Python은 베어 메탈언어가 아닙니다. 하드웨어에 직접 액세스하고 조작해야하는 경우 Python이 좋은 선택이 아닐 수 있습니다. 위의 포인트 1 (장치 드라이버)을 참조하십시오. Python에는 실제 머신 주소가 포함 된 실제 포인터가 없습니다. 이것은 경우에 따라 중요한 문제입니다.
  7. Python은 거의 단일 스레드입니다 (다른 답변 참조). 이것은 어떤 경우에는 큰 문제이고 (정말 많지는 않은 경우) 다른 경우에는 문제가되지 않습니다. Python은 기존 코어를 사용하는 데 특별히 좋은 작업을 수행하지 않습니다. 그러나 일부 매우 중요한 Python 라이브러리는 CUDA 코어를 활용합니다.

전반적으로 Python은 꽤 좋은 도구입니다. 개인적으로 좋아합니다. 그러나 모든 것을위한 올바른 선택은 아닙니다.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다