2013-03-08 2 views
11

동일한 문제 세트를 해결하기 위해 다음 코드를 살펴보십시오. 문제를 언급하는 것이 어쨌든 도움이 될 것이라고 생각하지 않습니다. Josephus problem의 또 다른 반복입니다.이 파이썬 코드는 어떻게 다르게 수행합니까?

용액 1 :

import sys 
from math import log 

cases= int(sys.stdin.readline()) 
current= 0 
while current < cases: 
    current += 1 
    n = int(sys.stdin.readline()) 
    print 2*(n - 2**(int(log(n,2))))+1 

이 용액 누적 1.0912 초 10 주어진 테스트 케이스를 해결하고 4360KiB 메모리를 소비한다.

용액 2 :

def josephus_2(n): 
    from math import log 
    return 2*(n - 2**(int(log(n,2))))+1 

import sys 
cases= int(sys.stdin.readline()) 
current= 0 
while current < cases: 
    current += 1 
    n = int(sys.stdin.readline()) 
    print josephus_2(n) 

이 용액 1.0497 초 전체에서 동일한 10 테스트 케이스를 해결하고 메모리 640KiB.

파이썬 n00b이기 때문에 온라인 심사 위원에 따르면 두 가지 모두 똑같은 점수를 얻었지만 해결책 2는 1보다 훨씬 빠르고 메모리 효율성은 더 높아 졌는지 궁금합니다. 나는 시간 차이가 매우 적은 소리를 수 있다는 것을 알고 있지만, 동시에 내가 기억 내 오랜 경험에서

Can this Screenshot help?

+0

이 직접 테스트 할 수있는 방법이 있나요 : 여기

는 성능 비교를 위해 사용할 수있는 코드인가? 첫 번째 방법은 나를 위해 훨씬 더 빠릅니다. – Blender

+0

복잡한 함수가 자체 메서드로 분리되어 있으면 JITing과 관련이있을 수 있습니다. 그냥 추측 – Patashu

+0

예제 파일이 있습니까? – Ivo

답변

1

더 빨리 C/C++/펄 제출보다, 가장 빠른 해결책에 나를 먼저 위 I 함수 (방법)에서 계산 부 퍼팅 언젠가 성능을 향상시킬 수 있음을 발견했다 :
I 바로 다음의 간단한 코드를 사용-경험 다시 : 제 (하여 계산)을 위해

n = 1000000 
def compute(n): 
    j = 0 
    for i in xrange(n): 
     j += 1 

tic() 
compute(n) 
toc() 

>>> 0.271 s 

tic() 
j = 0 
for i in xrange(n): 
    j += 1 
toc() 

>>> 0.849 s 

결과가 도시 0.271s을 인라인 코드로 0.849s입니다. 이것은 주요 연산 부분에서 아무 것도 변경하지 않고 눈에 띄는 개선입니다! 요점은 성능을 향상시킬 수있는 방법을 사용하는 것입니다.

from __future__ import division 
from time import clock 

def compute(n): 
    j = 0 
    for i in xrange(n): 
     j += 1 

n = 1000000 
print 'solution (2) using a method call...' 
t0 = clock() 
compute(n) 
print clock()-t0 
#>>> ~0.2415...        #faster (solution 2) 

print 'solution (1) all inline code...' 
t0 = clock() 
j = 0 
for i in xrange(n): 
    j += 1 
print clock()-t0 
#>>> ~0.6169...        #slower (solution 1) 
+0

내 경우에는 다른 방향으로 생각합니다. :) – whizzzkid

+0

@whizzzkid하지만 첫 번째 솔루션 (메서드 없음)은 1.0912 초, 메서드를 사용하는 두 번째 솔루션은 1.0497 초 밖에 걸리지 않았습니다. 이것은 0.0415 초를 절약하여 귀하의 경우에 개선 된 방법을 사용함을 의미합니다. 그래서 내 대답은 방법을 사용하여 성능을 향상 설명했다. 제 답변은 방법 (즉, 두 번째 해결책)을 사용하는 것입니다. – Developer

+0

방금 ​​['timeit'] (http://docs.python.org/2/library/timeit)을 사용하여 코드를 시험해 보았습니다.html)과 같은 결과를 얻었고 (repeat = 7, number = 10과 적절한'stmt'와'setup' 문자열로'repeat' 메소드의'min'을 사용하여) 두 메소드 모두에 대해 동일한 결과를 얻었습니다. –