문제

나는 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
.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top