2013-12-10 16 views
9

Xin chào, tôi muốn tích hợp chức năng từ 0 đến nhiều giới hạn trên khác nhau (khoảng 1000). Tôi đã viết một đoạn mã để làm điều này bằng cách sử dụng vòng lặp for và nối thêm mỗi giá trị vào một mảng trống. Tuy nhiên tôi nhận ra tôi có thể làm cho mã nhanh hơn bằng cách làm tích phân nhỏ hơn và sau đó thêm kết quả tích phân trước đó cho một trong những chỉ cần tính toán. Vì vậy, tôi sẽ làm cùng một số tích phân, nhưng trong một khoảng thời gian nhỏ hơn, sau đó chỉ cần thêm tích phân trước đó để có được tích phân từ 0 đến giới hạn trên đó. Heres mã của tôi tại thời điểm này:Làm sao để tích hợp python của tôi nhanh hơn?

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 

Tôi cần làm gì để thực hiện kỹ thuật tối ưu hóa?

+0

Có nên gọi là Lv không? Nếu không thì Lv không được khởi tạo trước khi phương thức chắp thêm được gọi. – Moustache

Trả lời

5

Về cơ bản, chúng tôi cần theo dõi các giá trị trước đó của Lvalg. 0 là giá trị ban đầu tốt cho cả hai, vì chúng ta muốn bắt đầu bằng cách thêm 0 vào tích phân đầu tiên, và 0 là khởi đầu của khoảng thời gian. Bạn có thể thay thế vòng lặp for của bạn bằng cách này:

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

Trong thử nghiệm của tôi, điều này nhanh hơn đáng kể.

Như @askewchan chỉ ra trong các ý kiến, điều này thậm chí còn nhanh hơn:

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

Bí quyết đẹp, nhiều hơn * đáng chú ý * nhanh hơn: P Bằng cách này, bạn có thể tăng tốc độ thêm 25% bằng cách bắt đầu với 'Lv = []', và ở cuối vòng lặp 'Lv.append (cuối cùng) ', và sau vòng lặp' Lv = np.array (Lv) '. – askewchan

+0

'Lv1' không được khởi tạo. –

+0

@WarrenWeckesser: Rất tiếc, 'Lv1' phải là' Lv'. Tôi đã chỉnh sửa câu trả lời. –

0

Sử dụng chức năng này:

scipy.integrate.cumtrapz

tôi đã có thể giảm thời gian xuống dưới độ chính xác của máy (rất nhỏ).

Chức năng thực hiện chính xác những gì bạn đang yêu cầu một cách hiệu quả cao. Xem tài liệu cho biết thêm: https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.integrate.cumtrapz.html

Các mã sau đây, mà tái tạo phiên bản đầu tiên và sau đó tôi:

# 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) 

nào luôn mang lại:

t1-t0 = O (0.1) giây

t3-t2 = 0 giây

Các vấn đề liên quan