1. 程式人生 > >比較一下numpy.math和Python標準庫的math.sin的計算速度

比較一下numpy.math和Python標準庫的math.sin的計算速度

我用下面這個小程式,比較了一下numpy.math和Python標準庫的math.sin的計算速度:

import time
import math
import numpy as np
x = [i * 0.001 for i in xrange(1000000)]
start = time.clock()
for i, t in enumerate(x):
x[i] = math.sin(t)
print "math.sin:", time.clock() - start
x = [i * 0.001 for i in xrange(1000000)]
x = np.array(x)
start = time.clock()
np.sin(x,x)
print "numpy.sin:", time.clock() - start
# 輸出
#math.sin: 0.503613560572
#numpy.sin: 0.0359889705123

在我的電腦上計算100萬次正弦值,numpy.sin比math.sin快10倍多。這得利於numpy.sin在C語言級
別的迴圈計算。numpy.sin同樣也支援對單個數值求正弦,例如:numpy.sin(0.5)。不過值得注意的
是,對單個數的計算math.sin則比numpy.sin快得多了,讓我們看下面這個測試程式:
x = [i * 0.001 for i in xrange(1000000)]
start = time.clock()
for i, t in enumerate(x):
    x[i] = np.sin(t)
print "numpy.sin loop:", time.clock() - start
# 輸出
#numpy.sin loop: 2.84674730553


請注意numpy.sin的計算速度只有math.sin的1/5。這是因為numpy.sin為了同時支援陣列和單個值的
計算,其C語言的內部實現要比math.sin複雜很多,如果我們同樣在Python級別進行迴圈的話,就會
看出其中的差別了。此外,numpy.sin返回的數的型別和math.sin返回的型別有所不同,math.sin返
回的是Python的標準float型別,而numpy.sin則返回一個numpy.float64型別