美文网首页
基于Python装饰器的向量化计算速度对比

基于Python装饰器的向量化计算速度对比

作者: 潇洒坤 | 来源:发表于2018-07-13 23:16 被阅读35次

    timer是一个装饰器,功能是给被装饰的函数计时。如果要进一步了解装饰器的使用,点击此链接Python闭包函数和装饰器
    sumOfLoop函数是常规的使用for进行循环遍历求和的方法;
    sumOfComprehension函数使用推导式得出新的列表,然后用内置sum函数求出列表的和;
    sumOfVectorization函数使用np.dot方法求出两个数据类型的为numpy.ndarray的对象的点积,两个向量a = [a1, a2,…, an]和b = [b1, b2,…, bn]的点积定义为:a·b=a1b1+a2b2+……+anbn
    np.random.rand()方法需要传入一个参数,例如传入参数为5,则返回一个数据类型为numpy.ndarray、长度为5、其中元素的值范围为0-1的对象,如下图所示:

    np.random.rand()方法.png
    from time import time
    import numpy as np
    
    def timer(func):
        def inner(*args,**kwargs):
            start = time()
            result = func(*args,**kwargs)
            end = time()
            usedTime = 1000 * (end - start)
            print("%s function used %.2f ms,return %.4f" %(func.__name__,usedTime,result))
            return result
        return inner
    
    @timer
    def sumOfLoop(np_array):
        result = 0
        for i in np_array:
            result += i * i
        return result
    
    @timer
    def sumOfComprehension(np_array):
        return sum([i * i for i in np_array])
    
    @timer
    def sumOfVectorization(np_array):
        return np.dot(np_array,np_array)
    
    if __name__ == "__main__":
        print("计算小数平方和三种方法对比:")
        n = np.random.rand(3000000)
        a = sumOfLoop(n)
        print(a)
        sumOfComprehension(n)
        sumOfVectorization(n)
        print("计算整数平方和三种方法对比:")
        n = np.array(range(3000000)).astype('int64')
        sumOfLoop(n)
        sumOfComprehension(n)
        sumOfVectorization(n)
    

    本文作者在2018年7月13日晚11点的运行结果如下:

    计算小数平方和三种方法对比:
    sumOfLoop function used 1036.76 ms,return 999213.4882
    sumOfComprehension function used 1103.75 ms,return 999213.4882
    sumOfVectorization function used 2.00 ms,return 999213.4882
    计算整数平方和三种方法对比:
    sumOfLoop function used 545.89 ms,return 8999995500000499712.0000
    sumOfComprehension function used 718.86 ms,return 8999995500000499712.0000
    sumOfVectorization function used 5.00 ms,return 8999995500000499712.0000

    相关文章

      网友评论

          本文标题:基于Python装饰器的向量化计算速度对比

          本文链接:https://www.haomeiwen.com/subject/nzfepftx.html