如果您使用 Python 的 NumPy 库,通常是因为您正在处理占用大量内存的大型数组。为了减少内存使用,您可能希望尽量减少不必要的重复项。
NumPy 有一个内置功能,可以在许多常见情况下透明地执行此操作:内存视图。而且,此功能还可以防止数组被垃圾回收,从而导致更高的内存使用率。在某些情况下,它可能会导致错误,数据会以意想不到的方式发生变异。
为了避免这些问题,让我们了解视图的工作原理以及对代码的影响。
预备知识:Python 列表
在查看 NumPy 数组和视图之前,让我们考虑一个有点相似的数据结构:Python 列表。
Python 列表与 NumPy 数组一样,是连续的内存块。当你对一个 Python 列表进行切片时,你会得到一个完全不同的列表,这意味着你正在分配一块新的内存:
>>> from psutil import Process
>>> Process().memory_info().rss
12247040
>>> list1 = [None] * 1_000_000
>>> Process().memory_info().rss
20463616
>>> list2 = list1[:500_000]
>>> Process().memory_info().rss
24580096
切片列表分配了更多内存。由于第二个列表是一个独立的副本,如果我们改变它,这不会影响第一个列表:
>>> list2[0