2013-02-12 55 views
0

我有下面的代碼可以完美運行:查找運行時間在Python

from __future__ import division 
    from math import log, sqrt 
    from scipy.stats import norm 
    from datetime import datetime 

    #Default values used for testing 
    s1 = 10; s2 = 20 
    sigma1 = 1.25; sigma2 = 1.45 
    t = 0.5; rho = 0.89 
    rate=0.05; y=0; k0 = 0.000001 

    sigma = lambda sig1=sigma1, sig2=sigma2, corr=rho: sqrt(sig1**2+sig2**2 -2*corr*sig1*sig2) 
    m_d1 = lambda stock1=s1, stock2=s2, sig1=sigma1, sig2=sigma2, time=t, corr=rho: (log(stock1/stock2)+1/2*sigma()**2*time)/(sigma()*sqrt(time)) 
    m_d2 = lambda stock1=s1, stock2=s2, sig1=sigma1, sig2=sigma2, time=t, corr=rho: m_d1() -sigma()*sqrt(time) 
    m_delta1 = lambda stock1=s1, stock2=s2, sig1=sigma1, sig2=sigma2, time=t, corr=rho: norm.cdf(m_d1()) 
    m_delta2 = lambda stock1=s1, stock2=s2, sig1=sigma1, sig2=sigma2, time=t, corr=rho: -norm.cdf(m_d2()) 
    m_gamma11 = lambda stock1=s1, stock2=s2, sig1=sigma1, sig2=sigma2, time=t, corr=rho: norm.pdf(m_d1())/(stock1*sigma()*sqrt(time)) 
    m_gamma22 = lambda stock1=s1, stock2=s2, sig1=sigma1, sig2=sigma2, time=t, corr=rho: norm.pdf(m_d2())/(stock2*sigma()*sqrt(time)) 
    m_gamma12 = lambda stock1=s1, stock2=s2, sig1=sigma1, sig2=sigma2, time=t, corr=rho:-norm.pdf(m_d1())/(stock2*sigma()*sqrt(time)) 
    m_theta = lambda stock1=s1, stock2=s2, sig1=sigma1, sig2=sigma2, time=t, corr=rho: -stock1*sigma()*norm.pdf(m_d1())/(2*sqrt(time)) 
    m_vega1 = lambda stock1=s1, stock2=s2, sig1=sigma1, sig2=sigma2, time=t, corr=rho: stock1*sqrt(t)*norm.pdf(m_d1())*((sig1-(corr*sig2))/sigma()) 
    m_vega2 = lambda stock1=s1, stock2=s2, sig1=sigma1, sig2=sigma2, time=t, corr=rho: stock1*sqrt(t)*norm.pdf(m_d1())*((sig2-(corr*sig1))/sigma()) 
    m_correlation = lambda stock1=s1, stock2=s2, sig1=sigma1, sig2=sigma2, time=t, corr=rho: -stock1*sqrt(t)*norm.pdf(m_d1())*((sig1*sig2)/sigma()) 
    m_margrabe = lambda stock1=s1, stock2=s2, sig1=sigma1, sig2=sigma2, time=t, corr=rho: stock1*norm.cdf(m_d1())-stock2*norm.cdf(m_d2()) 

    print "Margrabe = "+str(m_margrabe()) + "\n" 
    print "THE GREEKS \n" 
    print "Delta Asset 1 = "+str(m_delta1()) 
    print "Delta Stock 2 = "+str(m_delta2()) +"\n" 
    print "Gamma Asset 11 = "+str(m_gamma11()) 
    print "Gamma Stock 12 = "+str(m_gamma12()) 
    print "Gamma Stock 22 = "+str(m_gamma22()) + "\n" 
    print "Theta = "+str(m_theta()) +"\n" 
    print "Vega sigma 1 = "+str(m_vega1()) 
    print "Vega sigma 2 = "+str(m_vega2()) + "\n" 
    print "Correlation = "+str(m_correlation()) + "\n" 

它可以完美的,但現在我想看看我的電腦需要多長時間來運行這個程序。所以,谷歌搜索問題後,我發現2層的替代品:

1)從timeit進口計時器。而在我打印結果的一部分,我說:

print "Margrabe = "+str(m_margrabe()) +"\n" 
    t1 = Timer(lambda: m_margrabe()).timeit(number=1) 
    print "THE GREEKS \n" 
    print "Delta Asset 1 = "+str(m_delta1()) 
    t2 = Timer(lambda: m_delta1()).timeit(number=1) 
    print "Delta Stock 2 = "+str(m_delta2()) +"\n" 
    t3 = Timer(lambda: m_delta2()).timeit(number=1) 
    print "Gamma Asset 11 = "+str(m_gamma11()) 
    t4 = Timer(lambda: m_gamma11()).timeit(number=1) 
    print "Gamma Stock 12 = "+str(m_gamma12()) 
    t5 = Timer(lambda: m_gamma12()).timeit(number=1) 
    print "Gamma Stock 22 = "+str(m_gamma22()) +"\n" 
    t6 = Timer(lambda: m_gamma22()).timeit(number=1) 
    print "Theta = "+str(m_theta()) + "\n" 
    t7 = Timer(lambda: m_theta()).timeit(number=1) 
    print "Vega sigma 1 = "+str(m_vega1()) 
    t8 = Timer(lambda: m_vega1()).timeit(number=1) 
    print "Vega sigma 2 = "+str(m_vega2()) +"\n" 
    t9 = Timer(lambda: m_vega2()).timeit(number=1) 
    print "Correlation = "+str(m_correlation()) + "\n" 
    t10 = Timer(lambda: m_correlation()).timeit(number=1) 
    print "Running Time = " + str(t1+t2+t3+t4+t5+t6+t7+t8+t9+t10) 

這工作得很好:我得到運行從日期時間進口日期時間時間= 0.00682769470029

2):

startTime = datetime.now() 
    # Same code as before" 
    print(datetime.now()-startTime) 

這也工作得很好,我得到:0:00:00.010000

我的問題我s:爲什麼兩種方法都不一樣?爲什麼我會得到不同的結果?有沒有辦法在一行中「計算運行時間」?

謝謝

UPDATE:

def printit(): 
     print "Margrabe = "+str(m_margrabe()) + "\n" 
     print "THE GREEKS \n" 
     print "Delta Asset 1 = "+str(m_delta1()) 
     print "Delta Stock 2 = "+str(m_delta2()) +"\n" 
     print "Gamma Asset 11 = "+str(m_gamma11()) 
     print "Gamma Stock 12 = "+str(m_gamma12()) 
     print "Gamma Stock 22 = "+str(m_gamma22()) + "\n" 
     print "Theta = "+str(m_theta()) +"\n" 
     print "Vega sigma 1 = "+str(m_vega1()) 
     print "Vega sigma 2 = "+str(m_vega2()) + "\n" 
     print "Correlation = "+str(m_correlation()) + "\n" 


    if __name__=='__main__': 
     printit() 

所以上我可以輸入(我的文件保存爲time1.py)

python -m timeit -s "import time1; time1.main()" 

,但我得到一個錯誤:「屬性錯誤:「模塊」對象有沒有屬性「主」

+0

for#2)using'''import time; time.time()''會比''datetime''好 – sotapme 2013-02-12 21:04:48

+0

Michael Foukarkis建議我使用命令行來計時。所以我把我的打印放在一個單獨的函數中,並且我從main調用了這個函數。但顯然我做錯了。我也嘗試調用main的所有函數,但是我得到相同的錯誤。幫我! – Oniropolo 2013-02-12 22:00:47

+0

這是因爲它不叫''main''你把它叫做''printit'' - ''蟒蛇-m timeit -s「進口時間1; time1.printit()'' - 對我的作品 – sotapme 2013-02-12 22:09:52

回答

2

你不需要儀器或在您的程序控制改變什麼我要衡量它。在命令行中,

python -m timeit -s "import mymodule; mymodule.main()" 

會告訴你的運行時間你的模塊的main()。修改語句以準確衡量您需要的內容。

從timeit和日期的結果之間的差異是可能因爲支持的日期時間精度低,但它應該是具有微秒級精度,所以我不能肯定地說。無論如何,timeit是手頭工作的正確工具。