我正在努力提高算法的速度,在查看调用的操作之后,我很难确定到底是什么在减慢速度我想知道python的deepcopy()是否可能是罪魁祸首,或者我是否应该进一步研究一下自己的代码。

最佳答案

查看代码(您也可以),它会遍历被引用对象树中的每个对象(例如dict的键和值、对象成员变量等),并为它们执行两项操作:
通过在id indexedmemodict中查看它是否已经被复制
对象的副本(如果没有)
第二个是简单对象的o(1)。对于复合对象,相同的例程处理它们,因此在树中的所有n个对象上,都是o(n)。第一部分,在dict中查找对象,是O(1) on average, but O(n) amortized worst case
所以充其量,平均来说,deepcopy是线性的memo中使用的键是id()值,即内存位置,因此它们不是随机分布在键空间(上面的“平均”部分)上的,它的行为可能会更糟,直到o(n^2)最坏的情况。在实际使用中,我确实观察到一些性能下降,但在大多数情况下,它表现为线性。
这是复杂的部分,但常数很大,deepcopy is anything but cheap很可能会引起你的问题。唯一确定的方法是使用探查器——去做吧。fwiw,我目前正在重写速度非常慢的代码,98%的执行时间都花在deepcopy上。

关于python - Python的deepcopy()的运行时复杂度是多少?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8957400/

10-09 05:23