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

简介: timer是一个装饰器,功能是给被装饰的函数计时。如果要进一步了解装饰器的使用,点击此链接Python闭包函数和装饰器sumOfLoop函数是常规的使用for进行循环遍历求和的方法;sumOfComprehension函数使用推导式得出新的列表,然后用内置sum函数求出列表的和;sumOfVectorization函数使用np.dot方法求出两个数据类型的为numpy.ndarray的对象的点积,两个向量a = [a1, a2,…, an]和b = [b1, b2,…, bn]的点积定义为:a·b=a1b1+a2b2+……+anbn。

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的对象,如下图所示:

img_1b837785833937e571d8fe7e87f87295.png
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

目录
相关文章
|
9天前
|
程序员 测试技术 Python
深入理解Python中的装饰器
深入理解Python中的装饰器
20 1
|
2天前
|
缓存 测试技术 Python
Python编程中的装饰器应用及性能优化
装饰器是Python中一种强大的功能,它允许我们修改或增强函数或类的行为,而无需修改其本身的代码。装饰器在Python中广泛应用,包括日志记录、性能测试、事务处理、缓存等。 **一、装饰器的基础
|
4天前
|
Python 缓存 开发者
Python中的装饰器:优雅而强大的代码增强工具
在Python编程中,装饰器是一种强大的工具,它允许开发者在不改变原有代码结构的情况下,增加额外的功能。本文将深入探讨Python中装饰器的概念、用法和实际应用,展示其在代码优化和增强方面的威力。
|
4天前
|
Python 设计模式 缓存
Python中的装饰器:提升代码可读性与可维护性
在Python编程中,装饰器是一种强大的工具,它可以提高代码的可读性和可维护性。本文将深入探讨装饰器的概念、用法以及实际应用场景,帮助读者更好地理解和利用Python中的装饰器。
|
4天前
|
Python 缓存
Python 中的装饰器:提升代码可读性与灵活性
Python 中的装饰器是一种强大的工具,它可以提高代码的可读性和灵活性。本文将深入探讨装饰器的概念、用法以及如何在实际项目中应用装饰器来简化代码、增加功能,以及解决常见的编程问题。
|
8天前
|
程序员 测试技术 Python
Python中的装饰器(Decorators) :深入解析与实战应用
Python中的装饰器(Decorators) :深入解析与实战应用
10 0
|
9天前
|
存储 缓存 Python
深入理解Python中的装饰器:原理与实战
深入理解Python中的装饰器:原理与实战
18 0
|
11天前
|
监控 Python
深入解析Python中的装饰器(Decorators)及其实用场景
装饰器是Python中一个强大且灵活的功能,它允许在不修改原有函数或类代码的情况下,动态地为其添加新的功能。本文不仅介绍了装饰器的基本概念、语法和工作原理,还通过具体实例展示了装饰器在日志记录、权限校验、性能分析等实用场景中的应用,旨在帮助读者深入理解装饰器的强大之处,并激发其在实际项目中的创新应用。
|
11天前
|
缓存 监控 数据安全/隐私保护
探索Python中的装饰器:一种强大的元编程工具
在Python编程中,装饰器是一个强大而优雅的元编程工具,它允许我们在不修改原有函数或类代码的情况下,为其添加新的功能或修改其行为。本文将带您深入了解Python装饰器的概念、工作原理及其在实际编程中的应用,通过示例演示如何创建和使用装饰器,并探讨其在代码复用、性能监控和日志记录等方面的强大作用。
|
12天前
|
监控 程序员 Python
Python装饰器:深入解析与应用
Python装饰器:深入解析与应用