python進階之numpy快速入門?Numpy和python内置的數學運算方法相比,到底有多快?,下面我們就來聊聊關于python進階之numpy快速入門?接下來我們就一起去了解一下吧!
Numpy和python内置的數學運算方法相比,到底有多快?!
本文用一個包含1百萬個浮點随機數的列表、對其求log10的對數并把結果保存為新的列表為例,分别使用for循環計算和Numpy 的對數計算函數進行結算,看看Numpy在數值計算方面的優勢。
衆所周知,numpy之所以計算速度快是因為使用了向量方法處理數據以及其方法内核都是用C語言編寫(基于CPython框架)而成。
Numpy數組采用相同的類型并壓縮保存,而python的一般列表采用的是一組指向對象的指針的數組,即使類型相同的列表也是如此,這樣做在本地引用方面有好處。除了這種差别之外,許多Numpy運算是用C語言編寫的,避免了在Python中的循環成本、間接使用指針以及檢查每個動态元素的類型,這樣在實施計算是就可以大幅度提高運算速度。
在實踐中這一優勢并不能充分發揮出來,因為通常遇到的數據集一般也就幾百萬條數據,很少有幾十億條記錄的數據集。
(筆者此前還寫過一篇文章:使用Numpy進行數值計算的神速度)
導入必要的工具包
import numpy as np
from math import log10 as lg10
import time
import matplotlib.pyplot as plt
import random
%matplotlib inline
# 要處理的數據數量 和 保存運算速度的列表
N = 1000000 #
speed = [] # 保存運算耗費的時間
# 創建一個列表,其元素為1百萬個随機浮點數
l1 = list(100*(np.random.random(N)) 1)
print("列表 l1 的長度:",len(l1))
# 列表l1的長度: 1000000
print("随機浮點數實例:", l1[:3])
随機浮點數實例如下:
随機浮點數實例: [13.870198558125312, 98.30583303631951, 62.793947122478635]
a1 = np.array(l1)
print(" a1 的構型 :",a1.shape)
print(" a1 的類型:",type(a1))
a1 的構型 : (1000000,)
a1 的類型: <class 'numpy.ndarray'>
創建一個空列表 l2,以便追加元素,
l2=[]
t1=time.time()
for item in l1:
l2.append(lg10(item))
t2 = time.time()
print("用for循環追加元素耗時: {} seconds".format(t2-t1))
speed.append(t2-t1)
用for循環追加元素耗時: 0.2657289505004883 秒
使用列表的相關方法追加元素的速度
t1=time.time()
l2 = [lg10(i) for i in range(1,1000001)]
t2 = time.time()
print("使用列表的相關方法追加元素,耗時{} 秒".format(t2-t1))
speed.append(t2-t1)
使用列表的相關方法追加元素,耗時0.13235092163085938 秒
使用 map() 方法追加元素的速度
def op1(x):
return (lg10(x))
t1=time.time()
l2=list(map(op1,l1))
t2 = time.time()
print("使用map()函數追加元素,耗時 {} 秒 ".format(t2-t1))
speed.append(t2-t1)
使用map()函數追加元素,耗時 0.21657609939575195 秒
使用 Numpy 的計算方法追加元素的速度,即用向量數組
t1=time.time()
a2=np.log10(a1)
t2 = time.time()
print("直接使用Numpy的求對數方法log10,耗時 {} 秒".format(t2-t1))
speed.append(t2-t1)
直接使用Numpy的求對數方法log10,耗時 0.011036396026611328 秒
把 a2 轉換為 列表 l3,
l3 = list(a2)
以上四種運算方法耗時,for循環方法約為0.265秒、列表的相關方法耗時約為0.132秒、map()方法耗時約為0.216,Numpy 的方法耗時約為0.011,可以看出,Numpy的方法比其他方法的速度快了至少一個量級,差别非常明顯。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!