gpt4 book ai didi

python - copy.deepcopy 还是创建一个新对象?

转载 作者:行者123 更新时间:2023-11-28 16:43:35 25 4
gpt4 key购买 nike

我正在开发一个实时应用程序,有时我需要为始终使用相同数据的新对象创建实例。

首先,我只是将它们实例化,但后来我意识到使用 copy.deepcopy 可能会更快。现在,我发现有人说 deepcopy 非常慢。

我不能简单地执行 copy.copy,因为我的对象有列表。

我的问题是,你知道更快的方法还是我只需要放弃并再次实例化它们?谢谢你的时间

最佳答案

我相信 copy.deepcopy() 仍然是纯 Python,所以它不太可能给你任何速度提升。

在我看来,这有点像早期优化的经典案例。我建议您编写直观的代码,在我看来,这只是实例化每个对象。然后您可以分析它并查看需要节省的地方(如果有的话)。在您的实际用例中,很可能某些完全不同的代码片段将成为瓶颈。

编辑: 我在原来的回答中忘记提到的一件事 - 如果您要复制列表,请确保使用切片符号 (new_list = old_list[:] ) 而不是在 Python 中迭代它,这会更慢。但是,这不会执行深层复制,因此如果您的列表有其他列表或字典,您将需要使用 deepcopy()。对于 dict 对象,使用 copy() 方法。

如果您仍然发现构建对象很花时间,那么您可以考虑如何加快速度。您可以尝试使用 __slots__ ,尽管它们通常是关于节省内存而不是 CPU 时间,所以我怀疑它们会给你带来多少好处。在极端情况下,您可以将对象推送到 C 扩展模块,这可能会更快,但会增加复杂性。这一直是我过去采用的方法,我在底层使用 native C 数据结构,并使用 Python 的特殊方法在顶部包装一个“类列表”或“类字典”接口(interface)。当然,这确实取决于您对用 C 编写代码感到满意。

(顺便说一句,除非你有令人信服的理由,否则我会避免使用 C++,C++ Python 扩展比普通 C 更容易构建 - 但是,如果你有良好的动机,这是完全可能的)

例如,如果您的对象有很长的列表,那么您可能从一种写时复制方法中获得一些好处,其中对象的克隆只保留相同的引用而不是复制列表。每次访问它们时,您都可以使用 sys.getrefcount()查看就地更新是否安全,或者您是否需要复制一份。这种方法可能容易出错且过于复杂,但我想我会出于兴趣提及它。

您还可以查看您的对象层次结构,看看是否可以将对象分解,以便可以在其他对象之间共享不需要复制的部分。同样,在修改此类共享对象时需要小心。

然而,重要的一点是您首先想要让您的代码正确然后然后让您的代码快速 一旦您从现实世界的使用中了解了执行此操作的最佳方法。

关于python - copy.deepcopy 还是创建一个新对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16211751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com