6

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

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

我不能仅仅copy.copy因为我的对象有列表。

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

4

1 回答 1

4

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

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

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

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

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

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

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

然而,重要的一点是,您首先要使您的代码正确然后一旦您从实际使用中了解了最佳方法,就可以使您的代码快速运行。

于 2013-04-25T10:13:49.790 回答