gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:11:29 24 4
gpt4 key购买 nike

假设我想使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com