2010年6月12日 星期六

HPC in python

最近花了很多力氣去寫 python. 為了加速, timeit, cProfile, guppy, Numpy, pypy, array module, 等等都用上了, 還是只能加速, 1/10 ~ 1/5.

一怒之下去看 python 的 source code, 發現他的程式碼寫得真好, 清楚易懂. 不過這不是重點 XD 重點是, python 的實作方式, 其實在 memory 上的 overhead 真的很大. 由於我的程式不是 CPU bound, 而是 memory I/O bound, 所以在 memory 方面的 overhead 影響我程式的效率就很大.

舉個例來說, Python 沒辦法開啟指定大小的 array, 你一定要一個一個元素新增! 當然, 還是有一些辦法可以新增. 例如
x= [0] * 7656
不過當指定的數字很大時, 這個記憶體的用量還是很驚人, 而我的數字大小是 4G...., 這個時候 python 本身在 memory 管理方面的能力, 反而會拖垮整個程式的速度....

另外, 由於 python 的哲學偏向產生新物件, 所以他的 string 是不可更改的, 當我的 string 很大時, 就變得很麻煩. 如果我要對一個 3 G 的字串做 shuffle, 就很難在不消耗太多記憶體的狀況下做到.

到最後我還是用 C/C++ 寫了..... 或許日後再用 ctypes 包起來吧.

沒有留言: