第2节,numpy数组与列表有什么不同

numpy与list之间的不同

1. 什么是数组

在对比numpy数组和python基础数据类型列表之前,我们先要搞清楚,什么是数组,这是一个非常重要的编程概念。

仅从字面上来理解它,数组就是一组数,虽然这个解释有点简陋,但并没有错,只是还缺少3个限制条件:

  1. 数组里的元素类型必须相同
  2. 数组里的元素在内存上是连续的
  3. 数组里的元素是有序的

特别声明,我本人最早使用c++编程语言,因此对数组的解释完全是参照该语言进行的。其他编程语言里或许也有数组的概念,但未必遵守上面全部3个限制条件。

python中的列表经常被用来充当数组,它也的确具备一些数组的特点,如果你从其他语言转到python的,那么在学习列表时就可以参照你所熟悉语言的数组进行学习。

2. numpy数组与列表的不同

对numpy数组和列表的比较,就围绕着数组的3个限制条件展开

先来看第一条,数组里的元素类型必须相同,这一点列表是不满足的,python的列表可以放入不同类型的数据,numpy数组则符合这一要求。

再来看第二条,数组里的元素在内存上是连续的,列表显然不满足,numpy数组在内存上是连续的么?也不是,官方介绍时只是强调numpy数组在内存上相比于列表更加紧凑。

最后一条,数组内的元素是有序的,这一点,numpy数组和列表都满足,这意味着你可以用索引来访问数据,不仅如此,他们都支持切片操作。

3. 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倍之多

4. 数组求和的小实例

对比完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

加入知识星球, 每天收获更多精彩内容

分享日常研究的python技术和遇到的问题及解决方案