建議盡量使用numpy中的數組整體或者切片操作,以避免循環,特別是多重循環,以顯著地提高科學計算的效率。
舉幾個簡單的例子如下:
假設A是一個長度為n的numpy數組:
1.計算A中元素的和,使用A.sum()或者np.sum(A),而不要使用循環求和。
2.判斷A中是否有大于1的元素,使用(A>1).any(),不要循環進行判斷。
3.將A中大于1的元素取出放入一個新的數組,使用A[A>1],不要循環判斷一個一個地取出元素。
4.取出A中指標為奇數的元素,使用A[1::2],不要使用循環。
5.將A中所有元素增大一倍,使用A*=2,不要循環遍歷每個元素乘2再賦值。
6.......
Python中做科學計算最常用最基礎的工具就是numpy了,有必要好好掌握。下面是Python做科學計算經常會用到的一些模塊和軟件包:
numpy:Python中最常用的數值計算庫,提供了一個通用且功能強大的高維數組結構及大量的科學計算函數(其中相當一部分和scipy有交叉),是Python中幾乎所有其他科學計算庫的基礎。
scipy:在numpy的基礎上提供了科學計算中各種常見問題的解決工具,包括數學物理中的各種特殊函數,數值積分,優化,插值,傅立葉變換,線性代數,信號處理,圖像處理,隨機數和概率分布,統計學等等。
sympy:Python中的符號計算庫,支持符號計算、高精度計算、模式匹配、繪圖、解方程、微積分、組合數學、離散數學、幾何學、概率與統計、物理學等方面的功能,能在很大程度上代替Mathematica和Matlab的符號計算功能。
Ipython:一個Python的交互式開發和計算環境,比Python自帶的shell好用且功能強大得多,支持變量自動補全,自動縮進,支持bashshell命令,內置了許多很有用的功能和函數。IPythonnotebook可以將代碼、圖像、注釋、公式和作圖集于一體,已經成為用Python做教學、計算、科研的一個重要工具。
matplotlb:Python做科學計算最常用和最重要的畫圖和數據可視化工具包。
h5py:用Python操作HDF5格式數據的工具。HDF5是一個應用廣泛的科學數據存儲格式,擁有一系列的優異特性,如支持非常多的數據類型,靈活,通用,跨平臺,可擴展,高效的I/O性能,支持幾乎無限量(高達EB)的單文件存儲等。
pandas:Python中常用的數據分析包,適合時間序列及金融數據分析。
emcee:Python實現的馬爾可夫鏈蒙特卡洛(MCMC)庫。
pymc:另一個實現貝葉斯統計模型和馬爾科夫鏈蒙塔卡洛采樣的工具。
近些年Python在高性能計算領域的應用也越來越廣泛,用Python做并行計算也是一個不錯的選擇,既簡單易用,又能在很多時候媲美C、C++和Fortran的執行性能。用Python做并行計算的途徑有很多,比如說使用標準庫中的[threading模塊](https://docs.python.org/2/library/threading.html)進行線程級別的并行,[multiprocessing模塊](https://docs.python.org/2/library/multiprocessing.html)進行進程級別的并行,[concurrent.futures模塊](https://docs.python.org/3/library/concurrent.futures.html)實現異步并行,使用[IPython.parallel模塊](https://ipython.org/ipython-doc/3/parallel/index.html)進行多種方式的并行,使用[mpi4py包](https://pypi.org/project/mpi4py/)進行MPI消息傳遞并行計算,等等。如果可以使用C/C++,Fortran或者使用cython為Python編寫擴展模塊,還可以使用OpenMP并行。對GPU編程則可以使用[pyCUDA](https://documen.tician.de/pycuda/)。我的個人[簡書專題](https://www.jianshu.com/c/5019bb7bada6)和[CSDN博客專欄](https://blog.csdn.net/column/details/26248.html)中有對用Python做并行計算的專門介紹并提供了大量的程序實例。有需要或者感興趣的可以了解下。