6

間のメモリと速度の点でより効率的なもの

d[(first,second)]

d[first][second]

dタプルまたは辞書の辞書はどこにありますか?

4

2 に答える 2

5

これは非常に不自然な例 (キーとして数字を使用して 'a' を 100 万回格納する) の場合、2 つの辞書を使用する方が大幅に高速であることを示す非常に基本的なテスト データです。

$ python -m timeit 'd = {i:{j:"a" for j in range(1000)} for i in range(1000)};a = [d[i][j] for j in range(1000) for i in range(1000)];'
10 loops, best of 3: 316 msec per loop
$ python -m timeit 'd = {(i, j):"a" for j in range(1000) for i in range(1000)};a = [d[i, j] for j in range(1000) for i in range(1000)];'
10 loops, best of 3: 970 msec per loop

もちろん、これらのテストは、何をしようとしているのかによっては、必ずしも意味があるとは限りません。何を保存するかを決定し、テストします。

もう少しデータ:

$ python -m timeit 'a = [(hash(i), hash(j)) for i in range(1000) for j in range(1000)]'
10 loops, best of 3: 304 msec per loop
$ python -m timeit 'a = [hash((i, j)) for i in range(1000) for j in range(1000)]'
10 loops, best of 3: 172 msec per loop
$ python -m timeit 'd = {i:{j:"a" for j in range(1000)} for i in range(1000)}'
10 loops, best of 3: 101 msec per loop
$ python -m timeit 'd = {(i, j):"a" for j in range(1000) for i in range(1000)}'
10 loops, best of 3: 645 msec per loop

繰り返しになりますが、これは明らかに実世界での使用を示しているわけではありませんが、そのようなタプルを使用して辞書を構築するコストは莫大であり、辞書内の辞書が勝つ場所であるように私には思えます。これは私を驚かせます、私は完全に異なる結果を期待していました。時間があるときに、さらにいくつかのことを試してみる必要があります。

于 2012-04-16T23:35:34.467 に答える
1

少し驚くべきことに、辞書のディクショナリは、CPython 2.7 と Pypy 1.8 の両方でタプルよりも高速です。

スペースは確認しませんでしたが、ps で確認できます。

于 2012-04-16T23:04:46.193 に答える