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