python向量化计算_基于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。

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向量化计算)