python: x-=a和x=x-a的效果和性能差别

探究

首先结论:

明显的区别在于X-=m的结果会在X上原位更改(in-place),而X = X-m会产生一个新的对象。

这样有两点需要注意:

  1. 由于python对于复杂对象,简单的Xc = X是浅拷贝,因此,以下代码会改掉原来的X,导致问题:

    Xc = X
    for i in range(5)
    	Xc -= Xc/2
    

  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)

结论

在大规模数组有频繁的自操作的时候,推荐使用一次深拷贝+“-=”操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值