程式碼詳解:如何用Python執行高效能的數學正規化?
全文共1140字,預計學習時長3分鐘
比較python中不同執行正規化的表現情況
對於任何以資料為中心的學科來講,其主要任務之一是使科學計算和數值計算更較迅速。對於以效能為核心的應用程式和資料處理通道來講,需要執行最佳範例並選擇正確的庫集。那麼,在開發和學習中有哪些技巧呢?
首先需要明確的是:編寫python程式碼和編寫pythonic程式碼之間存在很大差異。
這篇文章圍繞一些最常用的資料科學操作編寫了最佳(也存在爭議的)實踐。例如通過使用numpy向量化、平行計算和多執行緒來評估複雜的數學表示式,對ndarrays進行初始化。
定義數學表達的功能
處理大量數字是一項具有挑戰性的任務,如果要對這些元素進行數值運算,結果就會完全改變。
假設有一個數學表示式要在具有100,000個數字的陣列上進行評估:
y = |sin(x) + cos(x)|
使用範圍函式建立數字列表:
n = 1000000
data_num = range(n)
讓我們看看各種執行情況,最後會將所有使用timeit庫的執行情況進行比較:
1.一種非常簡單和直接的方法是遍歷整個資料集,並將函式f(x)(上面定義)的輸出附加到輸出列表物件。
otpt = []
for x in data_list:
otpt.append(f(x))
2.我們可以使用這些迭代器:
return [f(x) for x in data_list]
3.使用python的eval()方法可以實現相同的目的:
exp = 'abs(cos(x) + sin(x)) ** 0.5'
return [eval(exp) for x in data_list]
4. 我們可以使用numpy vectorization tack實現相同的演算法。
import numpy as np
data_np = np.arange(1000000)
def f4(data_np):
"""using the numpy vectorization
"""
return (np.abs(np.cos(data_np) + sin(data_np)) ** 0.5)
5.另一個專門用於評估這種數值表示式的庫是numexpr。 這個庫之所以變得非常便捷,是因為內建的多執行緒支援。
import numexpr as ne
ex = 'abs(cos(a) + sin(a)) ** 0.5'
ne.set_num_threads(5)
return ne.evaluate(ex)
我們列出了5種不同的範例來執行相同的操作。現在是時候檢查它們是否產生了相同的輸出。
將每個函式的輸出記錄為otpt1,otpt2等,以此類推。
我們可以使用numpy的allclose()方法來檢查兩個ndarray物件。
np.allclose(otpt1, otpt2)
np.allclose(otpt1, otpt3)
np.allclose(otpt1, otpt4)
np.allclose(otpt1, otpt5)
對於我們來說,他們應該都回歸最重要的問題,這也是這篇文章的焦點:
與處理時間相比,每個範例是如何進行比較的。這個函式將幫助我們獲得每個時間函式。
將所需引數傳遞給上述函式後,該函式使用timeit repeat來評估時間並對觀察到的值進行排序。
function_list = ['f1', 'f2', 'f3', 'f4', 'f5']
data_com_list = ['data_num', 'data_num', 'data_num', 'data_np', 'data_np']
record_comp_time(function_list, data_com_list)
我們得到以下效能速度:
從比較結果中可以清楚地看到,使用numexpr的函式在記錄時間內產生輸出,之後是使用numpy庫的函式4。
下面是在Github上執行的連結,用於整個程式碼基礎:
harshitcodes/python_paradigms
A guide to: How to compare different implementation paradigms in python? - harshitcodes/python_paradigms_github.com
結論
對於任何資料密集型操作,python都有許多方法可以提高程式碼的效能。如果出現問題,以通過使用不同範例和選擇正確的庫來進行組合以實現最優性。除了範例之外,還有一些非常有用的庫可以提高python程式碼的執行速度。
numexpr具有廣泛的操作範圍,這使得數值計算更加平穩和快速,下面其中一些操作。
- Cython將Python的編寫與C語言的速執行度相融合。
- Numba ,- 它動態地為CPU編譯Python程式碼。
- Python內建模組multiprocessing能夠進行並行處理。
留言 點贊 發個朋友圈
我們一起分享AI學習與發展的乾貨
編譯組:草田
相關連結:
https://www.codementor.io/harshittyagi/high-performance-mathematical-paradigms-in-python-pjc5yocqm
如需轉載,請後臺留言,遵守轉載規範
推薦文章閱讀
EMNLP2017論文集28篇論文解讀
2018年AI三大頂會中國學術成果全連結
ACL2017 論文集:34篇解讀乾貨全在這裡