2013-02-12 5 views
0

의 러닝 타임을 찾기 I 완벽하게 작동하는 다음과 같은 코드가 있습니다파이썬

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) from timeit import Timer. 나는 결과를 인쇄 부분에, 나는 추가 :

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

내 질문 i s : 두 가지 방법이 다른 이유는 무엇입니까? 왜 다른 결과가 나옵니까? 한 줄에 "실행 시간 계산"을하는 방법이 있습니까? 내가 입력 할 수 있습니다 (내 파일이 time1.py로 저장)

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

하지만 난 오류가에 따라서

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

: "속성 오류

UPDATE 주셔서 감사합니다 : '모듈'객체에는 'main'속성이 없습니다.

+0

for # 2) "가져 오기 시간; time.time()''''datetime'보다 우수합니다. – sotapme

+0

Michael Foukarkis는 명령 줄을 사용하여 시간을 제안했습니다. 그래서 저는 인쇄물을 별도의 기능에 넣었고, 저는 그 기능을 메인에서 호출했습니다. 그러나 분명히 잘못하고있다. 나는 또한 메인에서 모든 함수를 호출하려고했지만, 나는 같은 오류가 발생합니다. 도와주세요! – Oniropolo

+0

그것은''print''라고 불리는 것이 아니기 때문에입니다 -''python -m timeit -s ''는 임포트 time1, time1.printit()''- 저에게 적합합니다 – sotapme

답변

2

progr에서 아무 것도 측정하거나 변경할 필요가 없습니다. 그것을 측정하는 것입니다. 명령 줄에서

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

당신의 실행 시간을 말할 것이다 모듈의 main(). 명령문을 수정하여 필요한 것을 정확히 측정하십시오.

timeit과 datetime의 결과의 차이점은 아마도 datetime에서 지원하는 정밀도가 낮기 때문일 수 있지만 확실히 말할 수는 없으므로 마이크로 초 정밀도라고 가정합니다. 어쨌든 timeit은 당면한 작업에 적합한 도구입니다.