2013-12-10 47 views
9

嗨,我想集成一個功能從0到幾個不同的上限(約1000)。我已經寫了一段代碼來使用for循環並將每個值附加到一個空數組。但是我意識到我可以通過做更小的積分來使代碼更快,然後將以前的積分結果添加到剛剛計算的結果中。所以我會做相同數量的積分,但超過一個較小的區間,然後只需加上前面的積分即可得到從0到該上限的積分。繼承人我的代碼在這一刻:如何讓我的python集成更快?

import numpy as np        #importing all relevant modules and functions 
from scipy.integrate import quad 
import pylab as plt 
import datetime 
t0=datetime.datetime.now()      #initial time 
num=np.linspace(0,10,num=1000)     #setting up array of values for t 
Lt=np.array([])         #empty array that values for L(t) are appended to 
def L(t):          #defining function for L 
    return np.cos(2*np.pi*t) 
for g in num:         #setting up for loop to do integrals for L at the different values for t 
    Lval,x=quad(L,0,g)       #using the quad function to get the values for L. quad takes the function, where to start the integral from, where to end the integration 
    Lv=np.append(Lv,[Lval])      #appending the different values for L at different values for t 

我需要做什麼更改優化技術我建議?

+0

不應該叫Lv嗎?否則,在調用append方法之前,Lv不會被初始化。 – Moustache

回答

5

基本上,我們需要跟蹤以前的值Lvalg。 0對於兩者來說都是一個很好的初始值,因爲我們想從第一個積分加0開始,而0是間隔的開始。你可以用這個替換你的for循環:

last, lastG = 0, 0 
for g in num: 
    Lval,x = quad(L, lastG, g) 
    last, lastG = last + Lval, g 
    Lv=np.append(Lv,[last]) 

在我的測試中,這顯然更快。

由於@askewchan在評論中指出,這是更快:

Lv = [] 
last, lastG = 0, 0 
for g in num: 
    Lval,x = quad(L, lastG, g) 
    last, lastG = last + Lval, g 
    Lv.append(last) 
Lv = np.array(Lv) 
+1

不錯的技巧,超過*明顯*更快:P順便說一句,你可以從'Lv = []'開始,並在循環結尾'Lv.append(last )',在循環'Lv = np.array(Lv)'之後。 – askewchan

+0

「Lv1」未初始化。 –

+0

@WarrenWeckesser:糟糕,'Lv1'應該是'Lv'。我編輯了答案。 –

0

使用此功能:

scipy.integrate.cumtrapz

我能夠減少時間低於機器精度(非常小)。

該功能完全符合您所要求的高效方式。見文檔的更多信息:https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.integrate.cumtrapz.html

下面的代碼,它首先再現您的版本,然後我的:

# Module Declarations 
import numpy as np        
from scipy.integrate import quad 
from scipy.integrate import cumtrapz 
import time 

# Initialise Time Array      
num=np.linspace(0,10,num=1000) 

# Your Method  
t0 = time.time()     
Lv=np.array([])         
def L(t):          
    return np.cos(2*np.pi*t) 
for g in num:         
    Lval,x=quad(L,0,g)       
    Lv=np.append(Lv,[Lval]) 
t1 = time.time() 
print(t1-t0) 

# My Method 
t2 = time.time() 
functionValues = L(num) 
Lv_Version2 = cumtrapz(functionValues, num, initial=0) 
t3 = time.time() 
print(t3-t2) 

一貫地產生:

T1-T0 = O(0.1)秒

t3-t2 = 0秒

相關問題