Numpy和python内置的数学运算方法相比,到底有多快?!
本文用一个包含1百万个浮点随机数的列表、对其求log10的对数并把结果保存为新的列表为例,分别使用for循环计算和Numpy 的对数计算函数进行结算,看看Numpy在数值计算方面的优势。
众所周知,numpy之所以计算速度快是因为使用了向量方法处理数据以及其方法内核都是用C语言编写(基于CPython框架)而成。
Numpy数组采用相同的类型并压缩保存,而python的一般列表采用的是一组指向对象的指针的数组,即使类型相同的列表也是如此,这样做在本地引用方面有好处。除了这种差别之外,许多Numpy运算是用C语言编写的,避免了在Python中的循环成本、间接使用指针以及检查每个动态元素的类型,这样在实施计算是就可以大幅度提高运算速度。
在实践中这一优势并不能充分发挥出来,因为通常遇到的数据集一般也就几百万条数据,很少有几十亿条记录的数据集。
import numpy as npfrom math import log10 as lg10import timeimport matplotlib.pyplot as pltimport random%matplotlib inline# 要处理的数据数量 和 保存运算速度的列表N = 1000000 # speed = [] # 保存运算耗费的时间
数据准备
# 创建一个列表,其元素为1百万个随机浮点数l1 = list(100*(np.random.random(N))+1)print("列表 l1 的长度:",len(l1))# 列表l1的长度: 1000000print("随机浮点数实例:", l1[:3])
随机浮点数实例如下:
随机浮点数实例: [13.870198558125312, 98.30583303631951, 62.793947122478635]
根据列表 l1 创建 Numpy 数组对象,即把列表 l1 向量化
a1 = np.array(l1)
print(" a1 的构型 :",a1.shape)
print(" a1 的类型:",type(a1))
a1 的构型 : (1000000,)
a1 的类型: <class 'numpy.ndarray'>
创建一个空列表 l2,以便追加元素,
l2=[]
使用for循环追加元素的速度
t1=time.time()
for item in l1:
l2.append(lg10(item))
t2 = time.time()
print("用for循环追加元素耗时: {} seconds".format(t2-t1))
speed.append(t2-t1)
用for循环追加元素耗时: 0.2657289505004883 秒
使用列表的相关方法追加元素的速度
t1=time.time()
l2 = [lg10(i) for i in range(1,1000001)]
t2 = time.time()
print("使用列表的相关方法追加元素,耗时{} 秒".format(t2-t1))
speed.append(t2-t1)
使用列表的相关方法追加元素,耗时0.13235092163085938 秒
使用 map() 方法追加元素的速度
def op1(x):
return (lg10(x))
t1=time.time()
l2=list(map(op1,l1))
t2 = time.time()
print("使用map()函数追加元素,耗时 {} 秒 ".format(t2-t1))
speed.append(t2-t1)
使用map()函数追加元素,耗时 0.21657609939575195 秒
使用 Numpy 的计算方法追加元素的速度,即用向量数组
t1=time.time()
a2=np.log10(a1)
t2 = time.time()
print("直接使用Numpy的求对数方法log10,耗时 {} 秒".format(t2-t1))
speed.append(t2-t1)
直接使用Numpy的求对数方法log10,耗时 0.011036396026611328 秒
把 a2 转换为 列表 l3,
l3 = list(a2)
以上四种运算方法耗时,for循环方法约为0.265秒、列表的相关方法耗时约为0.132秒、map()方法耗时约为0.216,Numpy 的方法耗时约为0.011,可以看出,Numpy的方法比其他方法的速度快了至少一个量级,差别非常明显。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/76351
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!