0

各セットがまったく同じ長さであり、各セット内の各アイテムが同じ長さでsetある場合、数字のPythonまたは文字のPythonをループする方が速いですか?setなんで?

文字は数字[0-9]よりも可能な文字[a-zA-Z]が多く、そのため「ランダム」であり、ハッシュにある程度影響を与える可能性があるため、違いがあると思います。

numbers = set([00000,00001,00002,00003,00004,00005, ... 99999])

letters = set(['aaaaa','aaaab','aaaac','aaaad', ... 'aaabZZ']) # this is just an example, it does not actually end here

for item in numbers:
  do_something()

for item in letters:
  do_something()

ここで、len(numbers)== len(letters)

更新:Pythonの特定のハッシュアルゴリズムと、この実装の舞台裏で何が起こるかに興味があります。

4

2 に答える 2

6

Pythonの特定の実装の詳細があるかもしれませんが、ここでの私の一般的な議論が混乱していることに気づいていませんが、次のようになります。

  • 文字列のハッシュ操作は簡単ですが、文字列のハッシュ操作の実行には(わずかな)時間がかかるため、文字列のセットの作成は整数のセットの作成よりも少し遅くなる可能性があります(他はすべて等しい)。
  • セットを反復してもハッシュ操作は実行されないため、ハッシュする時間は関係ありません。
  • セットの反復は、セット内の要素の数と、セットをサポートするハッシュテーブル内のバケットの数によって異なります。したがって、ハッシュ関数の分散は、ハッシュテーブルによってバケット数が増加する場合にのみ重要になります。一部のハッシュテーブルの実装では、これは不可能です(バケット数は、衝突だけでなく、負荷率がしきい値を超えた場合にのみ増加するため)。他のハッシュテーブルの実装は、衝突が多い場合にサイズが変更されます。CPythonがどれかわかりません。
  • とにかく、整数のセットの特定の例は、十分に分散されたハッシュ値を生成します。
  • timeit気になるデータの現実的な例を使用して、Pythonでどちらが高速であるかを確認する1つの方法があります。憶測は通常時間の無駄です。

次のようなPythonのハッシュアルゴリズムの結果を確認できます。

>>> foo = 3
>>> foo.__hash__()
3
>>> foo = 1856348
>>> foo.__hash__()
1856348
>>> foo = "\x00"
>>> foo.__hash__()
1
>>> foo = "\x01"
>>> foo.__hash__()
128000384
>>> foo = "\x02"
>>> foo.__hash__()
256000771

したがって、私のPythonのコピーでは、これらのハッシュ結果は、これらの報告されたPythonハッシュアルゴリズムと一致します。CPythonの場合と同様に、ソースを調べてアルゴリズムを確認できます。

于 2012-09-10T08:23:22.040 に答える
2

あなたがプロファイリングするまであなたは知ることができません!ここにいくつかの大まかなデータがあります:

% python -mtimeit -s 'import string;import random;s=set("".join(random.sample(string.printable, 5))for _ in range(10000))' 'for foo in s: bar=foo'
1000 loops, best of 3: 376 usec per loop

% python -mtimeit -s 'import random;s=set(int("".join(map(str,random.sample(range(10),5))))for _ in range(10000))' 'for foo in s: bar=foo'                     
1000 loops, best of 3: 322 usec per loop

わずかな違いがあるのは正しいようですが、自信を持って多くのことを言うには、さらに多くのテストを行う必要があります。

于 2012-09-10T08:19:40.563 に答える