# Python的性能 ## 目錄 * 迴圈 * 演算法 * 二項樹 * 蒙地卡羅分析 * EWMA ## 用到增加Python性能方法 * 向量化(NumPy) * 動態編譯 (Numba) * 靜態編譯 (Cython) * 多處理 (Multiprocessing) ## 迴圈 主要內容為運用各種方法(向量化、動態編譯、靜態編譯、 多處理 )來處理同一問題 --> 產生n個亂數後求平均 其中程式碼如書中所示,此不一一列舉 結論如下表格: | 方法 | Python內建迴圈 | NumPy | Numba | Cython (從C匯入亂數產生器後) | | ---- | -------- | -------- | -------- | --- | | 速度 | 4th | 3rd | 2nd | 1st | | 備註 | 慢 | 比單純迴圈快,但記憶體使用量大 | 快又無記憶體用量問題且運用容易 | 最快但須改寫程式碼成C | > [name=温亮達] Q: 不懂動態編譯和靜態編譯定義、縮放值是啥 ## 演算法 ### 判斷是否為質數 | 方法 | Python內建迴圈 | Numba | Cython (從C匯入亂數產生器後) | | ---- | -------- | -------- | --- | | 速度 | 3rd(極慢) | 2nd (和Cython差不多) | 1st | | 備註 | 慢 | 快又無記憶體用量問題且運用容易 | 最快但須改寫程式碼成C | 另外,此可用多處理(一次查看多個數字是否為質數) 其中程式碼如書中所示,此不多提 ### 費氏數列 兩種做法: 遞迴、迭代 #### 遞迴 ***[遞迴迭代介紹](https://hackmd.io/@PythonTutor/By9P6avKd)*** | 遞迴 | 純Python | Numba | Cython | | ---- | ---- | -------- | -------- | | 速度 | 3rd | 2nd | 1st | ps. 遞迴缺點為中間結果不會被快取儲存 --> 若想儲存中間的值則需使用decorator(cache) > [name=温亮達] Q: decorator是啥 #### 迭代 | 迭代 | 純Python | Numba | Cython | | ---- | ---- | -------- | -------- | | 速度 | 3rd | 2nd | 1st | **ps. 若中間數字過大,編譯語言會失真(Numba、Cython需做調整)** --> 只能用Cython,且並須額外匯入較多位數的物件(希望我沒講錯)(ex. 如此匯入128-bit int) ### 用蒙地卡羅推導"拍" 邏輯: frac = 圓形面積/ 正方形面積 又圓形面積 = 半徑^2 * 拍 --> 拍 = frac * 正方形面積 / 半徑^2 | 方法 | Python內建迴圈 | NumPy | Numba | Cython (從C匯入亂數產生器後) | | ---- | -------- | -------- | -------- | --- | | 速度 | 4th | 3rd | 2nd | 1st | ## 二項樹 [二項數介紹1](https://publish.get.com.tw/BookPre_pdf/51MM020910-3.pdf) [二項數介紹2](https://ch-hsieh.blogspot.com/2010/05/risk-neutral-pricing.html) [二項數介紹2](https://wiki.mbalib.com/zh-tw/%E4%BA%8C%E9%A1%B9%E6%9C%9F%E6%9D%83%E5%AE%9A%E4%BB%B7%E6%A8%A1%E5%9E%8B)    | 方法 | Python內建迴圈 | NumPy | Numba | Cython (從C匯入亂數產生器後) | | ---- | -------- | -------- | -------- | --- | | 速度 | 4th | 3rd | 2nd | 1st | ## 蒙地卡羅分析   [蒙地卡羅介紹1](https://medium.com/mr-efacani-teatime/%E9%96%92%E8%81%8A%E9%9A%A8%E6%A9%9F%E9%A8%99%E5%B1%80-x-%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E9%A2%A8%E9%9A%AA%E5%88%86%E6%9E%90-x-%E7%A8%8B%E5%BC%8F%E8%A8%AD%E8%A8%88-a22baee76900) > 蒙地卡羅模擬邏輯: 將歷史資料的最後一天價格代入S_t... 求得隔日的價格差dS_t。 因此這個蒙特卡羅法,... 透過前一日的價格加上一個隨機變數幾何布朗運動的公式來產生隔日的價錢,不斷重複計算,就能推演出未來n天的價格走勢了。 再將此次模擬重複多次,可得出某標的的可能價格分布,附圖如下  [蒙地卡羅介紹2](https://www.investopedia.com/articles/07/montecarlo.asp) | 方法 | Python內建迴圈 | Numba | Cython | | ---- | -------- | -------- | --- | | 速度 | 3rd | 2nd | 1st | 另外,這裡也可以使用多處理 ex. 將十萬條走勢分十組,一組執行一萬條走勢 | 方法 | Python內建迴圈 | Numba | Cython | | ---- | -------- | -------- | --- | | 速度 | 3rd | 1st | 2nd | ## EWMA EWMA0 = S0 EWMAt = @ * St + (1-@) * EWMAt, t 屬於[1, 2,... T] 簡單來說就是時間加權版的移動均線 --> alpha越大則越重視最近的價格 [EWMA介紹](https://qualitytaiwan.wordpress.com/2013/09/15/ewma-control-charts-%E6%8C%87%E6%95%B8%E5%8A%A0%E6%AC%8A%E7%A7%BB%E5%8B%95%E5%B9%B3%E5%9D%87%E7%AE%A1%E5%88%B6%E5%9C%96/) | 方法 | Python內建函式(Series)| Python內建函式(直接用ndarray) | Numba_Series | Numba_Ndarray | Cython | | ---- | -------------- | ----- | ----- | ---------------------------- | --- | | 速度 | 5th | 4th | 3rd | 2nd | 1st |
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up