copy.deepcopy 或创建一个新对象?

XNo*_*Nor 6 python real-time

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

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

我不能简单地做一个,copy.copy因为我的对象有列表。

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

Car*_*roo 4

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

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

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

如果您仍然发现构建对象很耗时,那么您可以考虑如何加快速度。您可以尝试一下__slots__,尽管它们通常节省内存而不是 CPU 时间,所以我怀疑它们会为您购买太多。在极端情况下,您可以将对象推送到 C 扩展模块,这可能会更快,但会增加复杂性。这始终是我过去采用的方法,在底层使用本机 C 数据结构,并使用 Python 的特殊方法在顶部包装“类似列表”或“类似字典”接口。当然,这确实取决于您对 C 编码是否满意。

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

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

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

然而,重要的一点是,您首先希望代码正确然后在您从现实世界的使用中了解实现这一点的最佳方法后,使代码变得更快。