探究
首先结论:
明显的区别在于X-=m的结果会在X上原位更改(in-place),而X = X-m会产生一个新的对象。
这样有两点需要注意:
-
由于python对于复杂对象,简单的Xc = X是浅拷贝,因此,以下代码会改掉原来的X,导致问题:
Xc = X for i in range(5) Xc -= Xc/2
-
X=X-m是深拷贝,但是要注意性能问题,毕竟每次都新创建了一个对象。
针对以上两个问题讨论。
问题1:深拷贝
可以采用以下函数进行拷贝:
def copy_and_encapsule(x):
"""
deep copy a matrix or vector
:param x: src matrix or vector
:return: deep copy of x in type of numpy array
"""
if type(x) == np.ndarray:
return x.copy()
elif type(x) == list:
return np.array(x)
else:
raise Exception("unknown type: " + type(x))
问题2:性能
代码和结果如下,明显看出,X-=m要高效。
import numpy as np
def fun1():
N = 10000
X = np.random.rand(N, N)
m = np.random.rand(N, N)
for i in range(10):
X -= m
def fun2():
N = 10000
X = np.random.rand(N, N)
m = np.random.rand(N, N)
for i in range(10):
X = X - m
import timeit
timeit.timeit('fun1()', 'from __main__ import fun1', number=1)
timeit.timeit('fun2()', 'from __main__ import fun2', number=1)
结论
在大规模数组有频繁的自操作的时候,推荐使用一次深拷贝+“-=”操作。