Python中列表和数组的区别比较
在Python中,列表和数组都是可以用来存储一组有序的数据的数据结构,但是在具体实现和使用时二者还是有一些区别的。
列表(List)
Python中的列表是一种基本的数据结构,是一种动态数组(dynamically-sized array)。这意味着列表可以随时添加或移除元素,而且不需要先指定列表的容量。Python中的列表使用中括号[ ]创建,并通过逗号分隔元素。
下面是一个创建Python列表的示例:
fruits = ['apple', 'banana', 'orange', 'strawberry']
Python中的列表可以包含任何类型的数据,例如:
mixed_list = [1, "hello", 3.1415, True]
数组(Array)
Python中的数组并不是内置的数据类型,需要通过导入NumPy库来实现,NumPy(Numerical Python的缩写)是Python中处理数组的库。数组是一种类似于列表的数据结构,但其提供了较高的数值运算效率,而且数组所包含的元素必须是同一种数据类型。Python中的数组使用import语句加载NumPy库并创建。
下面是一个使用NumPy库创建Python数组的示例:
import numpy as np
a = np.array([1, 2, 3, 4])
也可以通过列表来创建一个数组:
b = np.array([[1, 2], [3, 4]])
我们可以使用dutype属性来了解数组元素的数据类型:
print(a.dtype) # int64
print(b.dtype) # int64
列表和数组的比较
-
数据类型:列表可以容纳任意类型的数据,数组所包含的元素必须是同一种数据类型。
-
内存管理和运算效率:数组使用的是相同数据类型的连续存储空间,数据读写效率高。 而列表由于是动态数组,需要在运行时动态申请和移动内存空间,会带来一定的额外开销。
示例说明
import time
'''
对于较大的数据集,对比列表和数组的加和运算时间(empirical runtime comparison):
'''
list1 = [i for i in range(100000)]
arr1 = np.array(list1)
# 计算列表的运算耗时
start = time.time()
list_sum = sum(list1)
end = time.time()
print("列表的运算时间为:", end - start, "秒")
# 计算数组的运算耗时
start = time.time()
arr_sum = np.sum(arr1)
end = time.time()
print("数组的运算时间为:", end - start, "秒")
结果显示:数组的运算比列表加和运算快了近一个数量级。
import matplotlib.pyplot as plt
'''
图示化数组和列表操作的数据分布和时间开销,比较往列表中添加元素和往数组中添加元素所需时间。
'''
# 绘制往列表中添加元素所需时间的柱状图
list_append_times = []
for i in range(1, 100001):
list_start = time.time()
list1.append(i)
list_end = time.time()
list_append_times.append(list_end - list_start)
plt.bar([i for i in range(1, 100001)], list_append_times)
plt.xlabel("元素个数")
plt.ylabel("运算时间(秒)")
plt.title("往列表中添加元素所需时间的变化趋势")
plt.show()
# 绘制往数组中添加元素所需时间的柱状图
arr_append_times = []
for i in range(1, 100001):
arr_start = time.time()
np.append(arr1, i)
arr_end = time.time()
arr_append_times.append(arr_end - arr_start)
plt.bar([i for i in range(1, 100001)], arr_append_times)
plt.xlabel("元素个数")
plt.ylabel("运算时间(秒)")
plt.title("往数组中添加元素所需时间的变化趋势")
plt.show()
可以看到,往列表中添加元素的计算时间随着元素个数的增加逐渐增长,而往数组中添加元素的计算时间保持基本稳定,几乎不变。这就是动态数组和固定数组在时间空间上的巨大差异。