编程起航:Python与科学计算库实战入门
昨天有个实习生跑来找我,说他的数据处理脚本跑了一晚上还没出结果。我过去看了一眼,发现他正在用Python原生列表循环处理一个几十万行的CSV文件,内存已经吃了好几个G,风扇狂转。我叹了口气,让他把代码里的for循环换成Pandas的read_csv加向量化操作,三秒跑完。他盯着屏幕愣了半天——这就是科学计算库的威力。
为什么不用纯Python?
Python的列表很灵活,但处理数值计算时效率太低。每个元素都是完整的Python对象,内存开销大,计算时还要频繁做类型检查。NumPy的底层是C实现的,数据在内存中连续存储,类型固定,CPU的SIMD指令能一次性处理多个数据。这个差异在数据量大的时候就是几分钟和几小时的区别。
# 别这样写!慢到怀疑人生data=[]withopen('large_file.csv')asf:forlineinf:row=line.strip().split(',')processed=[float(x)*2forxinrow]data.append(processed)# 试试这个,快得不像Pythonimportpandasaspd df=pd.read_csv('large_file.csv')result=df*2# 向量化操作,底层是C循环NumPy:数值计算的基石
NumPy的核心是ndarray(N维数组)。这东西看起来像列表,但骨子里完全不同。创建数组时就要想清楚数据类型,别让NumPy去猜。
importnumpyasnp# 创建数组时显式指定类型,避免后续麻烦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)# 整数除