两种方差计算方法的时间消耗记录

第一博客
公众号:深度学习视觉


由于近期看见了BN中方差新的计算方法,不明白为什么要用那种计算方式,所以做了一次简单的性能测试。
两种方差计算公式:
1/n ∑ i = 0 n x i 2 − ∑ i = 0 n x i ∗ u \sum_{i=0}^n x_i^2 - \sum_{i=0}^n x_i * u i=0nxi2i=0nxiu

1/n ∑ i = 0 n ( x i − u ) 2 \sum_{i=0}^n (x_i - u) ^2 i=0n(xiu)2

u = 1 n ∑ i = 0 n x i u = \frac{1}{n}\sum_{i=0}^n x_i u=n1i=0nxi

方法名12345mean备注备注
input_.sum()0.0050.0050.0050.0040.0050.0047npsum+int
input_.mean()0.0120.0090.1090.1090.0090.0107npmean+int
np.power(input_,2).sum()0.0510.0460.0450.0440.0460.047nppower+sum+int
np.power(input_,2)0.0440.0410.0400.0400.0400.041nppower+int
_.sum0.0040.0040.0050.0050.0050.0045np:上面数值求和sum+int
np.power(input_ - mean,2)0.440.440.440.440.440.44nppower减法+int
_.sum()0.0040.0040.0040.0050.0040.0041np:上面数值求和sum+int
np.power(input_ + mean,2)0.400.410.410.410.420.412np,mean=3.5power加法+float
sum() / len()0.0060.0050.0040.0050.0070.0055自定义均值:先求和再均值自定义sum+div+len+int
np.power(input_,2)0.0430.0520.0450.0410.0420.0446变快:input在整型的情况下power+int
np.power(input_,2)0.320.320.320.320.320.32float64power+float
input_ + mean0.04180.04180.04180.0430.04180.0418float64np_array+float
np.power(input_+mean,2)0.4110.4120.4120.4110.4170.412float64power加法+float
自定义方差0.350.340.360.360.340.35float64power + sum+div+len+float
np.power(input_,2).sum()0.3290.3420.330.330.3370.33float64power + sum+float
  1. 主要消耗在power中有运算操作。比如power(a+b)

以下是测试代码,需要的自取测试。

import numpy as np
import time
input_ = np.random.randint(0,10,(10000000))

定义时间消耗计时器

def getTimeCost(f):
    def wrapper(*args,**kwargs):
        # x是从被修饰函数中传入的一个参数
        start = time.time()
        result = f(*args,**kwargs)
        end = time.time()
        print("{}:  costTime:{}".format(f.__name__,(end - start)))
        return end - start
    return wrapper

每部分时间消耗

@getTimeCost
def getVar_fast2(input_):
    
    st1 = time.time()
    numel = len(input_)
    et1 = time.time()
    print("len(input_):",et1-st1)
    
    sum_ = input_.sum()
    et2 = time.time()
    print("input_.sum():",et2-et1)
    
    mean = sum_ / numel
    et3 = time.time()
    print("sum div numel:",et3-et2)
    
    square = np.power(input_,2)
    et4 = time.time()
    print("np.power(input_,2):",et4-et3)
    
    sum_of_square = square.sum()
    et5 = time.time()
    print("square.sum():",et5-et4)

    sumvar = sum_of_square - sum_ * mean
    et6 = time.time()
    print("sum_of_square:",et6-et5)
    
    return sumvar

@getTimeCost
def getVar_np2(input_):
    
    st1 = time.time()
    mean = input_.mean()
    et1 = time.time()
    print("input_.mean:",et1-st1)
    
    et2 = time.time()
    minus = input_ - mean
    print("minus=input_ - mean:",et2-et1)
    
    power = np.power(minus,2).sum()
    et3 = time.time()
    print("input_.power(minus,2):",et3-et2)
    
    sumvar = power.sum()
    et4 = time.time()
    print("power.sum():",et4-et3)
    
    return sumvar

print("1.",40*"=")
x = input_ * 1.1
r = [getVar_fast2(x) for i in range(1)]
print("all mean:",np.array(r).mean())

print("2.",40*"=")
r = [getVar_np2(x) for i in range(1)]
print("all mean:",np.array(r).mean())
时间消耗数值
1. ========================================
len(input_): 0.0
input_.sum(): 0.014959335327148438
sum div numel: 0.0
np.power(input_,2): 0.33510398864746094
square.sum(): 0.012965917587280273
sum_of_square: 0.0
getVar_fast2:  costTime:0.3700096607208252
all mean: 0.3700096607208252
2. ========================================
input_.mean: 0.023946523666381836
minus=input_ - mean: 0.0
input_.power(minus,2): 0.46773767471313477
power.sum(): 0.0
getVar_np2:  costTime:0.5006604194641113
all mean: 0.5006604194641113

两种方差计算方法如下

@getTimeCost
def getVar_fast2(input_):
    numel = len(input_)
    sum_ = input_.sum()
    mean = sum_ / numel
    
    sum_of_square = np.power(input_,2).sum()
    sumvar = sum_of_square - sum_ * mean
    
    return sumvar

@getTimeCost
def getVar_np2(input_):
    mean = input_.mean()
    sumvar = np.power(input_ - mean,2).sum()
    
    return sumvar

getVar_fast2(input_)
getVar_np2(input_)

#cost time: 0.05784344673156738
#cost time: 0.4697434902191162

计算求和的时间消耗

@getTimeCost
def getSum(input_):
    sum_ = input_.sum()
    
getSum(input_)
# out: getSum:  costTime:0.006983041

计算方差计算部分的时间消耗

numel = len(input_)
sum_ = input_.sum()
mean = sum_ / numel

@getTimeCost
def getVar_fast1(input_1):
    sum_of_square = np.power(input_,2).sum()
    sumvar = sum_of_square - sum_ * mean
    
    return sumvar


mean = input_.mean()
@getTimeCost
def getVar_np1(input_1):
    sumvar = np.power(input_ - mean,2).sum()
    
    return sumvar

getVar_fast1(input_)
getVar_np1(input_)

# getVar_fast1:  costTime:0.048866748
# getVar_np1:  costTime:0.4687469

计算均值部分的时间消耗

@getTimeCost
def getMean_fast1(input_):
    numel = len(input_)
    sum_ = input_.sum()
    mean = sum_ / numel
    
    return mean

@getTimeCost
def getMean_np1(input_):
    mean = input_.mean()
    
    return mean

getMean_fast1(input_)
getMean_np1(input_)

# getMean_fast1:  costTime:0.0059847831
# getMean_np1:  costTime:0.010972023
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值