要「矢量化」使用numpy
,這一切都意味着,而不是做一個明確的循環一樣,
for i in range(1, n):
c = c + f(i)
然後,而不是你應該做i
成numpy的數組,隨便拿其總和:
i = np.arange(1,n)
c = i.sum()
numpy自動爲您做矢量化。這個速度更快的原因是因爲numpy循環比普通的python循環更好的優化方式,出於各種原因。一般來說,迴路/陣列越長,優勢越好。這裏是你的梯形積分來實現:
import numpy as np
def f1(x):
return 2*x + 1
# Here's your original function modified just a little bit:
def integ(f,a,b,n):
h = (b-a)/n
a1 = (h/2)*f(a)
b1 = (h/2)*f(b)
c1 = 0
for i in range(1,n,1):
c1 = f((a+i*h))+c1
return a1 + b1 + h*c1
# Here's the 'vectorized' function:
def vinteg(f, a, b, n):
h = (b-a)/n
ab = 0.5 * h * (f(a)+f(b)) #only divide h/2 once
# use numpy to make `i` a 1d array:
i = np.arange(1, n)
# then, passing a numpy array to `f()` means that `f` returns an array
c = f(a + h*i) # now c is a numpy array
return ab + c.sum() # ab + np.sum(c) is equivalent
在這裏,我將導入我叫tmp.py
爲ipython
會議的時機更容易比使用time.time
:快
import trap
f = trap.f1
a = 0
b = 100
n = 1000
timeit trap.integ(f, a, b, n)
#1000 loops, best of 3: 378 us per loop
timeit trap.vinteg(f, a, b, n)
#10000 loops, best of 3: 51.6 us per loop
哇,七次。
看它是否有助於多的小n
n = 10
timeit trap.integ(f, a, b, n)
#100000 loops, best of 3: 6 us per loop
timeit trap.vinteg(f, a, b, n)
#10000 loops, best of 3: 43.4 us per loop
不,小環形慢得多!那麼非常大的n
?
n = 10000
timeit trap.integ(f, a, b, n)
#100 loops, best of 3: 3.69 ms per loop
timeit trap.vinteg(f, a, b, n)
#10000 loops, best of 3: 111 us per loop
快三十倍!
嗨Ardeshir,你知道什麼意思是「矢量化」的問題? – askewchan 2013-04-05 14:50:05
你可以閱讀前面的頁面,這有助於你理解。 – 2013-04-05 15:34:11
我明白了,我問你是否確實如果你明白,你有沒有試圖實現它? – askewchan 2013-04-05 15:43:31