核心差异
| 特性 | 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 数组是 “高效数值计算工具”,后者是科学计算、数据分析、机器学习的基础