Numpy和python内置的数学运算方法相比,到底有多快?,下面我们就来聊聊关于python进阶之numpy快速入门?接下来我们就一起去了解一下吧!

python进阶之numpy快速入门(python技巧-Numpy计算速度到底有多快)

python进阶之numpy快速入门

Numpy和python内置的数学运算方法相比,到底有多快?!

本文用一个包含1百万个浮点随机数的列表、对其求log10的对数并把结果保存为新的列表为例,分别使用for循环计算和Numpy 的对数计算函数进行结算,看看Numpy在数值计算方面的优势。

众所周知,numpy之所以计算速度快是因为使用了向量方法处理数据以及其方法内核都是用C语言编写(基于CPython框架)而成。

Numpy数组采用相同的类型并压缩保存,而python的一般列表采用的是一组指向对象的指针的数组,即使类型相同的列表也是如此,这样做在本地引用方面有好处。除了这种差别之外,许多Numpy运算是用C语言编写的,避免了在Python中的循环成本、间接使用指针以及检查每个动态元素的类型,这样在实施计算是就可以大幅度提高运算速度。

在实践中这一优势并不能充分发挥出来,因为通常遇到的数据集一般也就几百万条数据,很少有几十亿条记录的数据集。

(笔者此前还写过一篇文章:使用Numpy进行数值计算的神速度)

导入必要的工具包

import numpy as np from math import log10 as lg10 import time import matplotlib.pyplot as plt import random %matplotlib inline # 要处理的数据数量 和 保存运算速度的列表 N = 1000000 # speed = [] # 保存运算耗费的时间

数据准备

# 创建一个列表,其元素为1百万个随机浮点数 l1 = list(100*(np.random.random(N)) 1) print("列表 l1 的长度:",len(l1)) # 列表l1的长度: 1000000 print("随机浮点数实例:", 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的方法比其他方法的速度快了至少一个量级,差别非常明显。

,