Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的二维与一维字典效率_Python_Performance_Dictionary_Nested_Tuples - Fatal编程技术网

Python中的二维与一维字典效率

Python中的二维与一维字典效率,python,performance,dictionary,nested,tuples,Python,Performance,Dictionary,Nested,Tuples,在内存和速度方面,哪种方法更有效 d[(第一,第二)] 及 d[第一][第二] 其中d是元组字典还是字典?令人惊讶的是,字典字典比CPython 2.7和Pypy 1.8中的元组都快 我没有检查空格,但你可以用ps来检查。这里有一些非常基本的测试数据,表明对于一个非常做作的示例(使用数字作为键存储“a”一百万次),使用两个字典要快得多 $ python -m timeit 'd = {i:{j:"a" for j in range(1000)} for i in range(1000)};a =

在内存和速度方面,哪种方法更有效

d[(第一,第二)]

d[第一][第二]


其中
d
是元组字典还是字典?

令人惊讶的是,字典字典比CPython 2.7和Pypy 1.8中的元组都快


我没有检查空格,但你可以用ps来检查。这里有一些非常基本的测试数据,表明对于一个非常做作的示例(使用数字作为键存储“a”一百万次),使用两个字典要快得多

$ 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

再一次,这显然不是现实世界中的使用,但在我看来,用元组构建字典的成本是巨大的,这就是字典中的字典胜出的地方。这让我惊讶,我期待着完全不同的结果。有时间的话,我还得多试几样。

第一本是一本字典,第二本是两本。Memorywise两个字典可能会消耗更多的内存,但这一切都取决于你的应用程序数据配置文件。我认为答案是这几乎可以忽略不计。这里真正的问题应该是:什么对使用它的代码的读者/作者更有用?miku的说法“第一个[语句]是一本词典,第二个[语句]是两本。”并不完全正确。第二条语句
d[a][b]
实际上是N+1个字典,其中N是
a
的唯一值的数量。性能在这里至关重要,因为对更快执行的需求远远超过了对代码质量/可读性的需求。字典是哈希表,对吗?当然它们很快,但是它们占用了很多空间。什么更快?直观地说,我希望在字典字典上的插入速度会慢一些,因为您经常需要初始化一个新字典(如果您使用的是新的第一个键)。但是,我希望访问速度更快,因为碰撞会减少一个数量级。请提供代码,以便我们可以看到您实际在进行的基准测试。有趣。我的猜测是,差异是散列一个
元组所需的时间增加了。
?@agf发布了更多的数据,我真的不知道为什么差异如此之大。使用元组构建dict的成本要高得多,但哈希元组实际上更快?我使用的是非常粗糙的方法,所以我可能读取的数据太多了,但我仍然有点困惑。我想知道在构建二维字典时,单独循环值是否可以让您缓存更多的数据。这似乎是一个潜在的解释。“注意,dict有一条快速路径(在实践中)只处理str键;这不会影响算法的复杂性,但会显著影响常量因素:一个典型程序完成的速度。”也可能会影响这一点。