在内存和速度方面,使用
d[(first,second)]
和d[first][second]
之间的哪一个更有效率,其中d
是元组或字典的字典?d[(first,second)]
和d[first][second]
之间的哪一个更有效率,其中d
是元组或字典的字典?以下是一些非常基本的测试数据,表明对于一个非常牵强附会的示例(使用数字作为键存储“a”一百万次),使用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
再次声明,这显然不是真实世界使用的指标,但在我看来,构建一个像这样包含元组的字典的成本是巨大的,这就是为什么字典中嵌套字典会更胜一筹。这让我感到惊讶,我原本期望完全不同的结果。等有时间时,我还需要尝试一些其他方法。
有点令人惊讶的是,在CPython 2.7和Pypy 1.8中,字典的字典比元组更快。
我没有检查空间,但你可以用ps来做到这一点。
d[a][b]
实际上是N+1个字典,其中N是a
的唯一值的数量。 - ninjagecko