昨天有个实习生跑来找我,说他的数据处理脚本跑了一晚上还没出结果。我过去看了一眼,发现他正在用Python原生列表循环处理一个几十万行的CSV文件,内存已经吃了好几个G,风扇狂转。我叹了口气,让他把代码里的for循环换成Pandas的read_csv加向量化操作,三秒跑完。他盯着屏幕愣了半天——这就是科学计算库的威力。
为什么不用纯Python?
Python的列表很灵活,但处理数值计算时效率太低。每个元素都是完整的Python对象,内存开销大,计算时还要频繁做类型检查。NumPy的底层是C实现的,数据在内存中连续存储,类型固定,CPU的SIMD指令能一次性处理多个数据。这个差异在数据量大的时候就是几分钟和几小时的区别。
# 别这样写!慢到怀疑人生
data = []
with open('large_file.csv') as f:
for line in f:
row = line.strip().split(',')
processed = [float(x) * 2 for x in row]
data.append(processed)
# 试试这个,快得不像Python
import pandas as pd
df = pd.read_csv('large_file.csv')
result = df * 2 # 向量化操作,底层是C循环
NumPy:数值计算的基石
NumPy的核心是ndarray(N维数组)。这东西看起来像列表,但骨子里完全不同。创建数组时就要想清楚数据类型,别让NumPy去猜。
import numpy as np
# 创建数组时显式指定类型,避免后续麻烦
arr = np.array([1, 2, 3], dtype=np.float32)
print(arr.itemsize) # 4字节,如果是Python列表,每个int至少28字节
# 这里踩过坑:整数除法
a = np.array([1, 2, 3])
print(a / 2) # 得到[0.5 1.0 1.5],Python3里没问题
print(a // 2) # 整数除
642



被折叠的 条评论
为什么被折叠?



