3 list vs array

4 阅读2分钟

核心差异

特性Python 列表(list)NumPy 数组(ndarray)
元素类型可包含不同类型元素(如整数、字符串、列表等)所有元素必须为同一类型(同质性)
内存存储存储元素的引用,内存不连续,占用空间大元素直接存储在连续内存块,内存效率高
运算方式需通过循环实现元素级运算,代码繁琐且速度慢支持向量化运算,直接对整个数组操作,速度快
维度操作多维列表是列表嵌套,无统一维度管理机制原生支持多维数组,提供 shape等属性管理维度
功能侧重通用数据存储,适合简单场景专为数值计算设计,内置丰富的数学运算函数

实例对比

1.元素类型差异

# Python 列表:可混合不同类型元素
py_list = [1, "hello", 3.14, [4, 5]]
print(py_list)  # [1, 'hello', 3.14, [4, 5]]

# NumPy 数组:元素必须同类型(自动转换为兼容类型)
import numpy as np
np_arr = np.array([1, "hello", 3.14])
print(np_arr)  # ['1' 'hello' '3.14'](所有元素被转换为字符串)

2.运算方式差异(核心区别)

# Python 列表:必须用循环,代码繁琐且效率低
py_list = [1, 2, 3, 4, 5]
result = [x + 10 for x in py_list]  # 需要列表推导式(本质是循环)
print(result)  # [11, 12, 13, 14, 15]

# NumPy 数组:直接向量化运算,简洁高效
np_arr = np.array([1, 2, 3, 4, 5])
result = np_arr + 10  # 无需循环,直接对整个数组操作
print(result)  # [11 12 13 14 15]

3.多维结构与操作差异

# Python 列表:通过列表嵌套实现多维,计算需手动循环
py_matrix = [[1, 2, 3], [4, 5, 6]]
row_sums = [sum(row) for row in py_matrix]  # 需循环遍历每行
print(row_sums)  # [6, 15]

# NumPy 数组:原生多维支持,直接用 axis 参数指定维度
np_matrix = np.array([[1, 2, 3], [4, 5, 6]])
row_sums = np_matrix.sum(axis=1)  # 一行代码完成行求和
print(row_sums)  # [ 6 15]

4. 内存效率差异

存储一百万个整数,对比内存占用

import sys

# Python 列表:每个元素是引用,内存占用高
py_list = [i for i in range(1000000)]
print(f"列表内存:{sys.getsizeof(py_list) + sum(sys.getsizeof(x) for x in py_list)} 字节")
# 输出约 40MB(因存储引用和整数对象)

# NumPy 数组:连续存储,内存占用低
np_arr = np.arange(1000000, dtype=np.int64)
print(f"NumPy 内存:{np_arr.nbytes} 字节")  # 输出 8,000,000 字节(仅 8MB)

总结

列表是 “通用容器”,NumPy 数组是 “高效数值计算工具”,后者是科学计算、数据分析、机器学习的基础