Python 的 deepcopy() 的运行时复杂度是多少?

2024-01-06

我正在尝试提高算法的速度,在查看了正在调用哪些操作之后,我很难准确地确定是什么导致速度变慢。我想知道 Python 的 deepcopy() 是否可能是罪魁祸首,或者我是否应该进一步研究我自己的代码。


查看代码(您也可以),它会遍历引用对象树中的每个对象(例如 dict 的键和值、对象成员变量……)并为它们做两件事:

  1. 通过在 id-indexed 中查找来查看它是否已被复制memo dict
  2. 对象的副本(如果没有)

第二个是O(1)对于简单的物体。对于复合对象,相同的例程处理它们,所以总的来说n树中的对象,即O(n)。第一部分,在字典中查找对象,是O(1)平均而言,但是O(n)最坏情况摊销 http://wiki.python.org/moin/TimeComplexity.

所以平均而言,充其量,deepcopy是线性的。使用的按键memo are id()值,即内存位置,因此它们不是随机分布在密钥空间(上面的“平均”部分)上,并且它可能表现得更糟,直到O(n^2)最坏的情况下。我确实在实际使用中观察到一些性能下降,但在大多数情况下,它的表现是线性的。

这是复杂的部分,但是常数很大并且deepcopy一点也不便宜 http://writeonly.wordpress.com/2009/05/07/deepcopy-is-a-pig-for-simple-data/并且很可能会导致您的问题。唯一确定的方法是使用探查器——去做吧。 FWIW,我目前正在重写非常慢的代码,其 98% 的执行时间都花在deepcopy.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 的 deepcopy() 的运行时复杂度是多少? 的相关文章

随机推荐