Pythonのハッシュ可能な型とは何ですか?


ベストアンサー

Pythonのハッシュ可能な型を理解するには、ハッシュとは何か、なぜそれが使用されるのかを理解する必要があります。したがって、ハッシュの概要は次のとおりです。

オブジェクトをハッシュするということは、実際には、何らかの関数を介してオブジェクトを実行していることを意味します。この関数はハッシュ関数と呼ばれます。このハッシュ関数が行うことは、一意の入力に対して一意の出力を提供することです。たとえば、ハッシュと呼ばれるハッシュ関数と、a!= b、次にhash(a)!= hash(b)のような2つの変数aとbがあるとします。理論的にはとにかく、実際には次のように実行します。ハッシュ衝突に。つまり、!= bですが、hash(a)== hash(b)です。例として、ハッシュ関数がx mod 10の場合、hash(12)== hash(2)があります。これを処理する方法はいくつかあります。

Pythonは、これを使用してキーを辞書に格納します。これを行う方法は、オブジェクトをハッシュし、ハッシュを配列内のインデックスにマップして、そこに値を配置することです。たとえば、キー「abc」に「123」を格納するとします。Pythonが辞書の配列を10に初期化したとします。pythonが行うことは、hash( abc)、次にmodです。それを辞書に入れるために10ずつ。たとえば、hash( abc)が1234を返すとします。Pythonはそれを10で変更して4を取得します。次に「123」をインデックス4に入れます。

したがって、基本的にハッシュ可能な型は単なる型です。 Pythonで\_\_hash\_\_と\_\_eq\_\_を上書きすることで、関数をハッシュ可能にすることができます。ただし、ハッシュが同じオブジェクトを取得するたびに同じものを返すように注意する必要があります。たとえば、\_\_ hash\_\_に乱数を返すようにした場合あなたがそれを呼ぶたびに、あなたはあなたのオブジェクトを二度とハッシュ可能に見つけることは決してないでしょう。同時に、すべてのオブジェクトに対して同じものを返したくないのは、多くの誤検知が発生するためです。

もちろん、これはもう少し複雑で、非常に複雑です。簡単な概要ですが、これがハッシュの背後にある基本です

回答

これは難しい質問です(ただし、良い質問です)。アメリカ英語では、質問は「Python言語ではできないことをすべてリストアップする」と読むことができます。それらすべてをリストするのに十分な知識がないので、それは(私にとって)難しいです。以下に、Pythonで実行できないことのいくつかを示します。詳細については、他のすべての回答をお読みください。

  1. Pythonはデバイスドライバーでは機能しません。デバイスドライバは、超高速で超応答性である必要があります。 Pythonもそうなる傾向はありません。デバイスドライバーはスタンドアロンで実行する必要があります。 Pythonには大規模なランタイムシステムがあります。 Pythonは、Javaのようなガベージコレクションシステムを使用しています。場合によっては、ガベージコレクションの一時停止が耐えられないことがあります。
  2. Pythonは一部の非常に小さなコンピューターでは使用できません。一部のコンピューター(一般的にはArduinoなど)はPythonには小さすぎます。 Pythonにはランタイムライブラリがあり、一部のマシンではメモリを大量に消費します。 MicroPythonと呼ばれるものがあります。ただし、MicroPythonでさえ、一部の(非常に小さい)システムよりもはるかに多くのメモリを使用します。 RaspberryPiは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は非常に優れたツールです。個人的には大好きです。ただし、すべてに適切な選択というわけではありません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です