2016-06-14 5 views
-2

私は、異なるキーのカウンタとして機能する辞書を持っています。つまり、キーの値は、キーが発生した回数です。 文字列インデックス付き辞書または整数インデックス付き辞書を使用する方が速いのですか?どちらがより良いパフォーマンスを備えていますか?PythonのDicionariesの文字列インデックスまたは整数インデックス?

+4

あなたはそれについて何か考えましたか? –

+3

どのくらいのデータが必要ですか?パフォーマンスは本当に重要ですか?私の本能は、プログラムするのが最も簡単なものと一緒に行くことです。 – Matthew

答えて

2
# coding=utf-8 

import sys 
import timeit 

print(sys.getsizeof(1000000000)) 
28 

print(sys.getsizeof('aaaaaaa')) 
56 

print(timeit.timeit('{1:1}', number=10 ** 7)) 
0.935662218856579 

print(timeit.timeit('{"1":1}', number=10 ** 7)) 
0.8795463330796326 

print(timeit.timeit(stmt='a[1]', setup='a = {1:1}', number=10 ** 7)) 
0.24523148719450227 

print(timeit.timeit(stmt='a["1"]',setup='a = {"1":1}', number=10 ** 7)) 
0.22414418170794992 

print(timeit.timeit('{x*x:x for x in range(1000)}', number=1000)) 
0.10348407957872885 

print(timeit.timeit('{"a"*x:x for x in range(1000)}', number=1000)) 
0.5330044677382393 

int型は、より少ないメモリを使用しますが、それは割り当て、辞書からのアクセスに来るとき、私たちはint型が高速化され、その場合には、文字列で辞書を満たしている場合を除き、文字列が....ほんの少し速くなります。

リカルド氏は言った。私はそこに重要な違いがあるとは思わない。

速くしたい場合は、PyPyを使用します。

+0

興味深い。それはPythonの 'hash()'関数が文字列のほうが速いからですか? –

+0

私はこのテストを少し不公平だと考えています。なぜならあなたは1文字の長さだけの文字列を使用していますが、整数の場合は完全な64ビット表現を持っているからです。そして、OPによって掲示された問題の面では、私は文字列が1文字の長さの範囲にあることを疑う。 –

+0

追加される余分な文字ごとに文字列のサイズが1ずつ増加するので、実際には多数のキーのいずれかを使用できます。しかしintは通常は常に小さくなります。それがなぜより速いのか?よく分かりません。 intは自分自身のハッシュコードなので、 'hash()'には関係しないとは思うけど、本当に言うことはできません。 –

1

あなたの答えは「ほとんど」違いはありません。

Q:なぜほとんどですか?

A:文字列は、文字列を数字にマップするためにインタープリタが必要なため、文字列のサイズに応じて、整数よりも時間がかかることがあります。しかし、それは文字列のサイズによって異なる場合があります。

しかし、あなたのケースにほとんど違いはありません。 Basili Syrakisによって提供された答えに結果が示された。

辞書はハッシュテーブルに基づいているため、指定されたキーの値を返すには漸近的にO(1)が必要です。あなたのケースでは大きな違いはありません。

+0

実際の結論に投票しました –

関連する問題