帶你入門比Python更高效的Numpy(附程式碼)
簡介
向量化技巧對於資料科學家來說是相當熟知的,並且常用於程式設計中,以加速整體資料轉換,其中簡單的數學變化通過可迭代物件(例如列表)執行。未受到重視的是,把有一定規模的程式碼模組,如條件迴圈,進行向量化,也能帶來一些好處。
正文
Python正在迅速成為資料科學家的程式設計實戰語言。但與R或Julia不同的是,它是通用型程式語言,沒有功能語法來立即開始分析和轉換數值資料。所以,它需要專門的庫。
Numpy是Numerical Python的縮寫,是Python生態系統中高效能科學計算和資料分析所需的基礎軟體包。它是幾乎所有高階工具(如Pandas和scikit-learn)的基礎。
TensorFlow使用NumPy陣列作為基礎構建模組,在這些模組的基礎上,他們為深度學習任務(在長列表/向量/數字矩陣上大量使用線性代數運算)構建了張量物件(Tensor objects)和圖形流(graphflow)許多Numpy操作都是用C語言實現的,避免了Python中迴圈的基本代價,即指標間接定址和每個元素的動態型別檢查。速度的提升取決於您正在執行的操作。對於資料科學和現代機器學習的任務來說,這是一個非常寶貴的優勢。
我最近一篇文章講了使用Numpy向量化簡單資料轉換任務的優勢,它引起了一些聯想,並受到讀者的歡迎。關於程式碼簡化等向量化的效用,也有一些有趣的討論。
現在,基於某些預定義條件的數學轉換在資料科學任務中相當普遍。事實證明,通過首先轉換為函式然後使用numpy.vectorize方法,可以輕鬆地對條件迴圈的簡單模組進行向量化。在我之前的文章中,我展示了Numpy向量化簡單數學變換後一個數量級的速度提升。對於目前的情況來說,由於內部條件迴圈仍然效率低下,速度提升並不那麼顯著。但是,與其他純粹Python程式碼相比,執行時間至少要提高20-50%。
以下是演示它的簡單程式碼:
import numpy as np
from math import sin as sn
import matplotlib.pyplot as plt
import time
# 測試數量
N_point = 1000
# 定義一個有if else迴圈的函式
def myfunc(x,y):
if (x>0.5*y and y<0.3): return (sn(x-y))
elif (x<0.5*y): return 0
elif (x>0.2*y): return (2*sn(x+2*y))
else: return (sn(y+x))
# 從正態分佈產生儲存元素的列表
lst_x = np.random.randn(N_point)
lst_y = np.random.randn(N_point)
lst_result = []
# 可選擇畫出資料分佈
plt.hist(lst_x,bins=20)
plt.show()
plt.hist(lst_y,bins=20)
plt.show()
# 首先,純粹的Python程式碼
t1=time.time()
First, plain vanilla for-loop
t1=time.time()
for i in range(len(lst_x)):
x = lst_x[i]
y= lst_y[i]
if (x>0.5*y and y<0.3):
lst_result.append(sn(x-y))
elif (x<0.5*y):
lst_result.append(0)
elif (x>0.2*y):
lst_result.append(2*sn(x+2*y))
else:
lst_result.append(sn(y+x))
t2=time.time()
print("
Time taken by the plain vanilla for-loop
----------------------------------------------
{} us".format(1000000*(t2-t1)))
# List comprehension
print("
Time taken by list comprehension and zip
"+`-`*40)
%timeit lst_result = [myfunc(x,y) for x,y in zip(lst_x,lst_y)]
# Map() 函式
print("
Time taken by map function
"+`-`*40)
%timeit list(map(myfunc,lst_x,lst_y))
# Numpy.vectorize 方法
print("
Time taken by numpy.vectorize method
"+`-`*40)
vectfunc = np.vectorize(myfunc,otypes=[np.float],cache=False)
%timeit list(vectfunc(lst_x,lst_y))
# 結果
Time taken by the plain vanilla for-loop
----------------------------------------------
2000.0934600830078 us
Time taken by list comprehension and zip
----------------------------------------
1000 loops, best of 3: 810 µs per loop
Time taken by map function
----------------------------------------
1000 loops, best of 3: 726 µs per loop
Time taken by numpy.vectorize method
----------------------------------------
1000 loops, best of 3: 516 µs per
請注意,我已經在任何可以把表示式用一行語句來實現的地方使用了%timeit Jupyter魔術命令。這樣我就可以有效執行超過1000個相同表示式的迴圈,來計算平均執行時間以避免任何隨機效應。因此,如果您在Jupyter Notebook中執行整個指令碼,則可能會出現與第一種情況(即普通迴圈執行)略有不同的結果,但接下來的三種應該會給出非常一致的趨勢(基於您的計算機硬體)。
我們看到的證據表明,對於基於一系列條件檢查的資料轉換任務,與一般Python方法相比,使用Numpy的向量化方法通常會使速度提高20-50%。
這貌似不是一個顯著改進,但節省的每一點時間都可以加入資料科學工作流程中,從長遠來看是值得的!如果資料科學工作要求這種轉換髮生一百萬次,那麼可能會導致短則八小時,長則兩天的差異。
簡而言之,任何時候你有長的資料列表並需要對它們進行數學轉換,都應強烈考慮將這些Python資料結構(列表或元組或字典)轉換為numpy.ndarray物件並使用自帶的向量化功能。
Numpy提供了一個用於更快程式碼執行的C應用程式介面(C-API),但是它失去了Python程式設計的簡單性。這個Scipy講義能告訴你在這方面的所有相關選項。
原文釋出時間為:2018-07-16
本文作者:TIRTHAJYOTI SARKAR
本文來自雲棲社群合作伙伴“資料派THU”,瞭解相關資訊可以關注“資料派THU”
相關文章
- 帶你高效入門 FlutterFlutter
- 一文帶你入門圖論和網路分析(附Python程式碼)圖論Python
- Python中的Numpy入門教程Python
- CSS快速入門基礎篇,讓你快速上手(附帶程式碼案例)CSS
- 帶引數的 Python 裝飾器讓你的程式碼更優雅Python
- 11個Python Pandas小技巧讓你的工作更高效(附程式碼例項)Python
- Python如何高效、快速入門?Python
- 2 個案例帶你迅速入門 Python Flask 框架PythonFlask框架
- 包教包會!7段程式碼帶你玩轉Python條件語句(附程式碼)Python
- Numpy使用入門
- numpy入門指南
- Python人工智慧常用庫Numpy使用入門Python人工智慧
- 帶你ECharts入個門Echarts
- 跟我學Python影像處理丨帶你入門OpenGLPython
- 清晰易懂的Numpy入門教程
- MSIL入門(一)C#程式碼與IL程式碼對比C#
- OpenCV 機器視覺入門精選 100 題(附 Python 程式碼)OpenCV視覺Python
- 一篇帶你入門面向介面程式設計程式設計
- Cris 帶你快速入門 Flink
- Python入門塔防小遊戲,開發步驟和原始碼,帶你輕鬆學pythonPython遊戲原始碼
- 如何高效的學習Python爬蟲技術?Python入門Python爬蟲
- 讓你的Python程式碼更乾淨只需簡單一步Python
- 一文帶你入門LinuxLinux
- 12個例子帶你入門Electron
- 帶你入門RPC之反向代理RPC
- 一文帶你入門TransformerORM
- 一文帶你入門 GolangGolang
- Python入門筆記(程式碼中成長)Python筆記
- numpy 基礎入門 - 30分鐘學會numpy
- 50 行 Python 程式碼,帶你追到最心愛的人Python
- .Net 7 的AOT的程式比託管程式碼更容易破解?
- 帶有Python的音訊處理(附帶原始碼)Python音訊原始碼
- Python入門知識彙總,程式設計小白的福利,為你開啟Python大門Python程式設計
- 一篇文章帶你入門SQL程式設計GIFUSQL程式設計
- 帶你入門Python爬蟲,8個常用爬蟲技巧盤點Python爬蟲
- 2020Python就業前景如何?這套教程帶你迅速入門!Python就業
- 入門IT該學Java還是Python?帶你全面分析優劣勢JavaPython
- NumPy從入門到放棄