Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.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_Dictionary - Fatal编程技术网

Python 为什么抄写字典这么慢?

Python 为什么抄写字典这么慢?,python,dictionary,Python,Dictionary,我正在解决一个关于代码出现的问题,结果发现我的运行时太糟糕了。我使用了一个有一百万个条目的字典作为一种“链接hashmap”,在这里我可以访问条目,它的值是它指向的下一个条目,所以我有一个O(1)查找时间的链接列表。在某个时候,我不得不抄写这篇口述,这也是我用simple所做的 new_dict = dict(dictionary) 在玩了一会儿代码之后,我删除了这个复制部分,只在一个字典上运行了整个代码。它突然将我的运行速度提高了几个数量级! 为什么我的代码的这一部分会造成这样的瓶颈?这实际

我正在解决一个关于代码出现的问题,结果发现我的运行时太糟糕了。我使用了一个有一百万个条目的字典作为一种“链接hashmap”,在这里我可以访问条目,它的值是它指向的下一个条目,所以我有一个O(1)查找时间的链接列表。在某个时候,我不得不抄写这篇口述,这也是我用simple所做的

new_dict = dict(dictionary)
在玩了一会儿代码之后,我删除了这个复制部分,只在一个字典上运行了整个代码。它突然将我的运行速度提高了几个数量级!
为什么我的代码的这一部分会造成这样的瓶颈?

这实际上有点有趣。
dictionary.copy()
dict(dictionary)
都会对
dictionary
中的数据进行浅拷贝,但是,其中一个似乎运行得更快

我不太清楚为什么会这样,但我觉得发布我的发现会很有趣。也许有人能在评论中给我一些启示:

import timeit
数据={i:i表示范围(10000)内的i}
打印(timeit.timeit(lambda:data.copy(),number=20000))
打印(timeit.timeit(lambda:dict(数据),数字=20000))
如果我不得不猜测的话,我会说,
dict(dictionary)
正在检查每个键值对以重建哈希表,
dictionary.copy()
可能只是复制哈希表,并跳过了大量所需的工作


我猜这是因为
dict(d)
内置可以传递给实现字典接口的任何对象,而该接口可能不使用相同的哈希表实现,需要在复制数据时对其进行重构。

这实际上有点有趣。
dictionary.copy()
dict(dictionary)
都会对
dictionary
中的数据进行浅拷贝,但是,其中一个似乎运行得更快

我不太清楚为什么会这样,但我觉得发布我的发现会很有趣。也许有人能在评论中给我一些启示:

import timeit
数据={i:i表示范围(10000)内的i}
打印(timeit.timeit(lambda:data.copy(),number=20000))
打印(timeit.timeit(lambda:dict(数据),数字=20000))
如果我不得不猜测的话,我会说,
dict(dictionary)
正在检查每个键值对以重建哈希表,
dictionary.copy()
可能只是复制哈希表,并跳过了大量所需的工作


我猜这是因为
dict(d)
内置可以传递给实现dictionary接口的任何对象,而该接口可能不使用相同的哈希表实现,需要在复制数据时对其进行重构。

复制任何集合都需要与其大小成比例的时间。请尝试
dictionary.copy()
。为了测试,我(平面)用多种方法复制了一个10**8项字典。所有这些都花了大约3-5秒,这在IMHO是可以接受的。当然,这是可以接受的,但我不得不做1000万次这样的操作,突然之间,它成为了一个巨大的瓶颈。我做的其他所有事情都是O(1),正如Schwobasegl所说,这是O(n),所以我想这就是为什么。你的字典有多大?如果超过50个,那么复制任何集合都会花费与其大小成比例的时间。请尝试
dictionary.copy()
。仅为了测试,我(平面)使用多种方法复制了一个10**8项的字典。所有这些都花了大约3-5秒,这在IMHO是可以接受的。当然,这是可以接受的,但我不得不做1000万次这样的操作,突然之间,它成为了一个巨大的瓶颈。我做的其他所有事情都是O(1),正如Schwobasegl所说,这是O(n),所以我想这就是为什么。你的字典有多大?如果超过50,当然需要时间
0.8178407099999999
3.9644210609999995