python - 多次递归切片 np 数组是否有任何惩罚?

标签 python numpy

假设我想使用 np 数组作为固定的只读队列并从它的前面弹出。这是一种自然的方法:

def pop(k,q):
    return q[:k],q[k:]
## example usage:
x = np.arange(1000)
for i in range(5):
    a,x = pop(i,x)
    print(a) 
这似乎很好,但我想确保没有隐藏状态或隐藏的引用,如果 q=q[k:]被执行数千或数百万次。似乎没有:取一个切片,np 只是存储一个指向原始数据缓冲区的指针和新索引。但我想确定一下,因为如果我遗漏了什么,我可以将其表示为一个元组 (np.array,index),它不是那么干净:
def pop0(k,q):
    x,i = q
    return x[i:i+k],(x,i+k)

最佳答案

这将是安全的。您可以使用 memory-profiler用于观察内存使用情况的包:
对于以下代码:

import numpy as np

@profile
def good_pop():
    def pop(k,q):
        return q[:k],q[k:]
    x = np.arange(10000)
    for i in range(5000):
        a,x = pop(i,x)

@profile
def bad_pop():
    def pop(k,q):
        return q[:k].copy(),q[k:].copy()
    x = np.arange(10000)
    for i in range(5000):
        a,x = pop(i,x)

good_pop()
bad_pop()
使用命令进行分析:
$ python3 -m memory_profiler file.py
产生的结果:
Line #    Mem usage    Increment   Line Contents
================================================
     3   49.023 MiB   49.023 MiB   @profile
     4                             def good_pop():
     5   49.023 MiB    0.000 MiB       def pop(k,q):
     6   49.023 MiB    0.000 MiB           return q[:k],q[k:]
     7   49.023 MiB    0.000 MiB       x = np.arange(10000)
     8   49.023 MiB    0.000 MiB       for i in range(5000):
     9   49.023 MiB    0.000 MiB           a,x = pop(i,x)


Line #    Mem usage    Increment   Line Contents
================================================
    11   49.023 MiB   49.023 MiB   @profile
    12                             def bad_pop():
    13   49.234 MiB    0.000 MiB       def pop(k,q):
    14   49.234 MiB    0.211 MiB           return q[:k].copy(),q[k:].copy()
    15   49.023 MiB    0.000 MiB       x = np.arange(10000)
    16   49.234 MiB    0.000 MiB       for i in range(5000):
    17   49.234 MiB    0.000 MiB           a,x = pop(i,x)
good_pop() 的一堆零证明在这个循环中没有创建额外的对象。

关于python - 多次递归切片 np 数组是否有任何惩罚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62539844/

相关文章:

python - `from x import y` 与 `from x.y import *`

python - 如何从 Path 切换到 os.path,反之亦然?

python - Matplotlib:来自 3 列 pandas 数据帧的 pcolormesh 或 pcolor

python - 在满足条件的情况下找到与另一个像素相关的最近像素的最快方法。 OpenCV NumPy

Python:每次函数运行时如何增加数字并存储在变量中

python - Visual C++ 编译器生成无法访问的 .pyd 文件

python - Pycharm 调试器,作为数组选项查看

python - 具有特定格式的 numpy 数组的 Numpy 数组

python - 每次对输出 NetCDF 变量进行赋值是否都会导致整个数据集的重写?

python - 了解 xarray.apply_ufunc