在对比numpy数组和python基础数据类型列表之前,我们先要搞清楚,什么是数组,这是一个非常重要的编程概念。
仅从字面上来理解它,数组就是一组数,虽然这个解释有点简陋,但并没有错,只是还缺少3个限制条件:
特别声明,我本人最早使用c++编程语言,因此对数组的解释完全是参照该语言进行的。其他编程语言里或许也有数组的概念,但未必遵守上面全部3个限制条件。
python中的列表经常被用来充当数组,它也的确具备一些数组的特点,如果你从其他语言转到python的,那么在学习列表时就可以参照你所熟悉语言的数组进行学习。
对numpy数组和列表的比较,就围绕着数组的3个限制条件展开
先来看第一条,数组里的元素类型必须相同,这一点列表是不满足的,python的列表可以放入不同类型的数据,numpy数组则符合这一要求。
再来看第二条,数组里的元素在内存上是连续的,列表显然不满足,numpy数组在内存上是连续的么?也不是,官方介绍时只是强调numpy数组在内存上相比于列表更加紧凑。
最后一条,数组内的元素是有序的,这一点,numpy数组和列表都满足,这意味着你可以用索引来访问数据,不仅如此,他们都支持切片操作。
下面的实验,测试numpy数组求和与列表求和哪个更快
import time
from numpy import arange
from timeit import Timer
n_elements = 100000
n_timeits = 10000
x = arange(n_elements)
y = list(range(n_elements))
t_numpy = Timer("x.sum()", "from __main__ import x")
t_list = Timer("sum(y)", "from __main__ import y")
t1 = time.time()
t_numpy.timeit(n_timeits)
t2 = time.time()
t_list.timeit(n_timeits)
t3 = time.time()
print(f"numpy 执行数组求和{n_timeits}次,耗时{t2-t1}秒")
print(f"list 执行数组求和{n_timeits}次,耗时{t3-t2}秒")
x,y 各自产生一个长度为n_elements 的数组,numpy与列表分别对他们求和n_timeits次,观察对比他们的用时
numpy 执行数组求和10000次,耗时0.42003321647644043秒
list 执行数组求和10000次,耗时15.222512006759644秒
两者相差36倍之多
对比完numpy数组和列表,用一个数组求和的小例子来结束本篇文章内容,也由此引出下一篇文章,如何创建numpy数组
import numpy as np
lst = [1, 2, 1, 2]
array = np.array([1, 2, 1, 2])
print(sum(lst)) # 6
print(array.sum()) # 6
QQ交流群: 211426309