NumPy阵列写时复制

cod*_*ife 4 python numpy copy-on-write

我有一个返回大型NumPy数组的类。这些数组被缓存在类中。我希望返回的数组是写时复制数组。如果调用者最终只是从数组中读取,则不会进行任何复制。这样可以避免使用多余的内存。但是,该数组是“可修改的”,但不会修改内部缓存的数组。

目前,我的解决方案是将所有缓存的数组设置为只读(a.flags.writeable = False)。这意味着,如果函数的调用者想要修改数组,则可能必须制作自己的数组副本。当然,如果源不是来自缓存,并且阵列已经可写,则它们将不必要地复制数据。

因此,最理想的情况是我喜欢这样的东西a.view(flag=copy_on_write)。似乎有个相反的标志,UPDATEIFCOPY一旦释放,副本就会更新原件。

谢谢!

max*_*axy 5

写入时复制是一个很好的概念,但显式复制似乎是“ NumPy理念”。因此,就个人而言,如果不太笨拙,我会保留“只读”解决方案。

但是我承认已经编写了自己的写时复制包装器类。我不会尝试检测对该数组的写访问。相反,该类具有方法“ get_array(readonly)”,返回其(否则为私有的)numpy数组。第一次使用“ readonly = False”进行调用时,它会进行复制。这是非常明确,易于阅读和快速理解的。

如果您的写时复制numpy数组看起来像经典的numpy数组,那么您的代码阅读者(可能是两年之内)可能会遇到困难。

  • 我已经采用了这种方法,但它始终是只读的,如果调用者希望它是读写的,他们可以自己复制它。 (2认同)