Python/Numpy大数据编程经验
Python/Numpy大数据编程经验
1.边处理边保存数据,不要处理完了一次性保存。不然程序跑了几小时甚至几天后挂了,就啥也没有了。即使部分结果不能实用,也可以分析程序流程的问题或者数据的特点。
2. 及时用 del 释放大块内存。Python缺省是在变量范围(variablescope)之外才释放一个变量,哪怕这个变量在后面的代码没有再被用到,所以需要手动释放大的array。
注意所有对数组的引用都del之后,数组才会被del。这些引用包括A[2:]这样的view,即使np.split也只是创建了view,没有真的把内存分到不同的array里。
3. 矩阵点乘对角阵,用逐行乘可以快几十、几百倍:M.dot( diag(v) ) -> M*v。
4. 尽量重用内存。比如
sqrtW = np.sqrt(W)
(W以后再没有用到了)
这样多了分配sqrtW内存的时间
可以改写成
np.sqrt(W,W) # in placesqrt
sqrtW = W # take auser-friendly name as its reference
类似的
A = B + C # B is neverused later
可以改写成
B += C; A = B
4. 用 ipython 的 run -p prog.py 做profiling,找出耗时最多的语句。
也可以实现简单的Timer类,打印出耗时流程使用的时间。
5. 把实际代码高度简化,只留下使用相同大小的内存和相同多的运算的skeleton,来事先评估算法的时间和空间复杂度。而且可以分块评估。比如
…… complex and slowroutine to compute V11, Wsum, Gwmean ......
for i in xrange(noncore_size):
wi = Wsum[ i ]
VW = V11.T* wi
VWV =VW.dot(V11)
V21[ i] =np.linalg.inv(VWV).dot( VW.dot(Gwmean[ i]) )
可以写个test.py,用 np.random.randn() 随机初始化 V11,Wsum, Gwmean,然后执行这个代码块,看出大致所需内存和每个循环的时间,避免了执行之前漫长的计算这些变量的时间。
6.如果是windows,把windows自动安装更新的选项关掉。不然可能跑了一夜程序,收结果时一看,windows自动重启过了……哭