这是安全的。您可以使用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
================================================
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
================================================
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)
< p >对于
good_pop()
的一堆零证明在这个循环中没有创建额外的对象。