cprofile의 원인이 다른 값을 반환하는 이유는 무엇입니까?
-
21-12-2019 - |
문제
나는 Python (3.3.1)에서 장기적인 캐쉬 플로우와의 상당히 간단하지만 FIDDLY 계약을 맺을 수 있도록 모델을 빌드하고 있습니다.완전한 모델은 시간이 소요되는 측면에서 상당히 복잡하므로 나는 그것을 시도하고 프로파일로 결정하기로 결정했습니다.그러나 나는 프로파일 링과 다른 답변을 얻고 있습니다.
코드를 다음 예제로 줄였습니다.
def generate_cashflows( income ):
contingent_expense = [1000.0]
income_cf = [income]
outgo_cf = [ -0.001 * contingent_expense[0] ]
bank = [ income_cf[0] + outgo_cf[0] ]
for t in range(1, 20):
contingent_expense.append(1000.0)
income_cf.append( income )
outgo_cf.append( -contingent_expense[t] * 0.001 )
bank.append( bank[t-1] * (1+0.05)**(1/12)
+ income_cf[t]
+ outgo_cf[t]
)
return bank[-1]
print(str(generate_cashflows(0)))
.
출력 :
calum@calum:~/pricing/model$ ./scratch.py
-20.793337746348953
calum@calum:~/pricing/model$ python -m cProfile scratch.py
-20.0
80 function calls in 0.000 seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 scratch.py:5(<module>)
1 0.000 0.000 0.000 0.000 scratch.py:5(generate_cashflows)
76 0.000 0.000 0.000 0.000 {method 'append' of 'list' objects}
1 0.000 0.000 0.000 0.000 {method 'disable' of '_lsprof.Profiler' objects}
1 0.000 0.000 0.000 0.000 {range}
calum@calum:~/pricing/model$
.
이 이유가 매번 다른 답변을 출력하는 이유에 대한 간단한 설명이 있습니까?나는 매뉴얼을 읽었지만 분명한 것을 보지 못한다.
해결책
첫째, Python3로 재현하고 "Python3 Scratch.py"및 "Python3 -m CProfile Scratch.py"를 실행하려고 시도했습니다. 내 컴퓨터에서 인쇄 -20.7933 ...
이유 -20.0은 파이썬 2.x에서 반환됩니다. Divison 연산자 "/"는 python2.x ( http://legacy.python.org/dev/peps/pep-0238/ )
python2, 1/12== 0
Python3, 1/12== 0.08333333 ....
Python2에서 라인
bank.append( bank[t-1] * (1+0.05)**(1/12)
.
가 간소화됩니다
bank.append( bank[t-1] * (1+0.05)**(0)
.
또는
bank.append( bank[t-1] * 1
.
이것은 아마도 당신이 의도 한 것이 아닙니다. Python3 해석은 아마도 올바르고 Python2는 상당히 쓸모 없게됩니다. 측면 음표로서 (1/12) ~ (1.0 / 12)는 모두 Python2와 Python3 모두에서 동일한 출력을 생성하며 코드가 프로파일 링이 있거나없는 것과 동일한 출력을 반환하지만 증상을 치료하는 것이 아니라 원인이 아닙니다. .
프로파일 링 및 Python2없이 프로파일 링없이 Python3을 사용하고 있지 않은 이유에 대한 최선의 추측은 프로파일 링이있는 Python3을 사용하는 것입니다. 의미있는 결과를 얻으려면 프로파일 링이 있고 프로파일 링이없는 코드를 실행할 때 동일한 버전의 Python을 사용합니다.
당신이 사용하고있는 사실 ./scratch.py는 아마도
라인이있을 것임을 나타냅니다.#!/usr/bin/python3
.
scratch.py의 상단에서 (제공된 코드에 포함되지 않았지만).
를 실행할 때./scratch.py
.
/ usr / bin / python3은 파일을 실행하는 데 사용됩니다
실행할 때
python -m cProfile scratch.py
.
기본 파이썬 인터프리터는 파일을 실행하는 데 사용됩니다 (추측하는 것입니다.)
명령 줄에서 "Python"을 실행하면 기본 설정이 2.x 인 경우는 아마도 표시됩니다.
코드를 프로파일 링과 함께 반환하도록 코드를 가져 오려면 Python3을 지정하는 것만 큼 간단해야합니다.
python3 -m cProfile scratch.py
.