2016-08-24 65 views
-1

只要寫的碼用於其使用ufuncifysympy一個函數,它是在寫爲numpy和一個函數計算的速度的比較:的Python:比較NumPy的的速度和SymPy ufuncified功能

import numpy as np 
from sympy import symbols, Matrix 
from sympy.utilities.autowrap import ufuncify 
u,v,e,a1,a0 = symbols('u v e a1 a0') 

dudt = u-u**3-v 
dvdt = e*(u-a1*v-a0) 

p = {'a1':0.5,'a0':1.5,'e':0.1} 

eqs = Matrix([dudt,dvdt]) 

numeqs=eqs.subs([(a1,p['a1']),(a0,p['a0']),(e,p['e'])]) 
print eqs 
print numeqs 

dudt = ufuncify([u,v],numeqs[0]) 
dvdt = ufuncify([u,v],numeqs[1]) 

def syrhs(u,v): 
    return dudt(u,v),dvdt(u,v) 

def nprhs(u,v,p): 
    dudt = u-u**3-v 
    dvdt = p['e']*(u-p['a1']*v-p['a0']) 
    return dudt,dvdt 

def compare(n=10000): 
    import time 
    timer_np=0 
    timer_sy=0 
    error = np.zeros(n) 
    for i in range(n): 
     u=np.random.random((128,128)) 
     v=np.random.random((128,128)) 
     start_time=time.time() 
     npcalc=np.ravel(nprhs(u,v,p)) 
     mid_time=time.time() 
     sycalc=np.ravel(syrhs(u,v)) 
     end_time=time.time() 
     timer_np+=(mid_time-start_time) 
     timer_sy+=(end_time-mid_time) 
     error[i]=np.max(np.abs(npcalc-sycalc)) 
    print "Max difference is ",np.max(error), ", and mean difference is ",np.mean(error) 
    print "Average speed for numpy ", timer_np/float(n) 
    print "Average speed for sympy ", timer_sy/float(n) 

在我的機器結果是:

In [21]: compare() 
Max difference is 5.55111512313e-17 , and mean difference is 5.55111512313e-17 
Average speed for numpy 0.00128133814335 
Average speed for sympy 0.00127074036598 

有關如何使上述任一功能更快的任何建議,歡迎您!

回答

0

經過進一步的探索,似乎ufuncify和常規numpy函數將給出或多或少相同的計算速度。使用numba或打印到theano函數沒有導致更快的代碼。因此,讓事情更快的另一種選擇是cython或包裝cFORTRAN的代碼。

+1

爲什麼你認爲存在速度問題? 'nprhs'直接向前''numpy'而不耗費Python循環。 p的字典查找可能會稍微減慢一些,但大部分時間都花在編譯的數學運算('-','**'等)上。 – hpaulj