详解Python中列表和数组的区别比较

  • Post category:Python

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

列表和数组的比较

  1. 数据类型:列表可以容纳任意类型的数据,数组所包含的元素必须是同一种数据类型。

  2. 内存管理和运算效率:数组使用的是相同数据类型的连续存储空间,数据读写效率高。 而列表由于是动态数组,需要在运行时动态申请和移动内存空间,会带来一定的额外开销。

示例说明

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()

可以看到,往列表中添加元素的计算时间随着元素个数的增加逐渐增长,而往数组中添加元素的计算时间保持基本稳定,几乎不变。这就是动态数组和固定数组在时间空间上的巨大差异。