2013-07-06 2 views
1

정수에서 읽으려면이 특정 상황에서 느린 결과를 제공 IO 대신빠른 fastly 내가 사용하고

cases = int(next(sys.stdin)) 

느린

cases = int(sys.stdin.readline()) 

내가 사용하는 모든 문제에 더 나은 타이밍을 받고있다 그러나 this SPOJ problemthe same codechef problem의 경우에는 첫 번째 대신 두 번째를 사용하면 더 나은 결과를 얻었습니다. 왜 이런 일이 일어 났는지 전혀 모르겠습니다.

두 번째 방법이이 특정 문제에 대한 첫 번째 방법과 비교하여 갑자기 빨라 졌던 이유는 무엇입니까? 여기

Timing results of SPOJtiming results of codechef

내가 사용하는 2 전체 코드는

import sys 
from itertools import islice 
def p(): 
    cases = int(next(sys.stdin)) 
    string = [i[:len(i) -1] for i in islice(sys.stdin, cases)] 
    for i in string: 
     ops, ans = [], [] 
     for c in i: 
      if c in ['+', '-', '*', '/', '^']: 
       ops.append(c) 
      elif c == ')': 
       ans.append(ops.pop()) 
      elif c == '(': 
       pass 
      else: 
       ans.append(c) 

     print ''.join(ans) 

p() 

하고 당신은 SPOJ 데이터가 충분하지 않습니다

import sys 
from itertools import islice 
def p(): 

    cases = int(sys.stdin.readline()) 
    string = [i[:len(i) -1] for i in islice(sys.stdin, cases)] 
    for i in string: 
     ops, ans = [], [] 
     for c in i: 
      if c in ['+', '-', '*', '/', '^']: 
       ops.append(c) 
      elif c == ')': 
       ans.append(ops.pop()) 
      elif c == '(': 
       pass 
      else: 
       ans.append(c) 

     print ''.join(ans) 

p() 
+0

http://codereview.stackexchange.com을 시도해보십시오. 질문은 오프 주제입니다. 그리고'timeit' 모듈을 사용하여 프로그램의 타이밍을 점검하십시오. –

+1

@AshwiniChaudhary 입력을 읽는 첫 번째 방법은 ** 빠릅니다. 나는 온라인 심사 위원들에게 많은 문제들을 조사했다. 이 모순을주는 것을 간과하고있는이 문제의 해결책과 특별히 관련이 있습니다. 그러므로 그것은 화제가 아닙니다. 이 질문은 [질문 할 수있는 것] (http : //stackoverflow.com/help/on-topic)에서 명시 적으로 언급 한 '특정 프로그래밍 문제'를 다루기 때문에 –

답변

0

두 번째가 있습니다 타이밍. 코덱 타이밍은 모두 내게 너무 가까이 다가옵니다.

하나.readline() 전화 및 next() 호출 간의 타이밍 차이가 스왑 가용성의 차이로 내려 올거야, 다른 프로세스, 즉 시스템에 을 등 I/O 플러시를하지 실행 두 가지 접근 방식 간의 실제 성능 차이.

실제 속도가 다른 것보다 빠르면 알아낼 수 있도록 자신의 컴퓨터에서 수천 회 실행에 대한 자신의 타이밍을 수행해야합니다.

+0

SPOJ에서 '0.10'의 타이밍은 두 번째 코드 및 타이밍 '0.19'은 첫 번째 코드를 나타냅니다. 코덱 타이밍이 너무 가깝다는 것이 맞습니다. 다양한 테스트 입력을 제공하여 적절한 타이밍을 수행하는 방법에 대해 연구하고 있습니다. 그것은 약간의 시간이 걸립니다. 'timeit' 모듈을 올바로 사용할 수있을 때 업데이트하고 단위 테스트를 올바르게 작성하는 법을 배웁니다. –

+0

SPOJ **에서 각 문제를 한 번 ** 실행했습니다. 당신은 타이밍에서 많은 것을 읽을 수 없습니다. 또한 SPOJ가 사용하는 ** 정확한 ** 설정을 알고 있습니까? OS, 커널 매개 변수, 파이썬 버전? 여기서 OS가 파이썬보다 더 중요한 요소 인 I/O 속도에 대해 이야기하고 있습니다. –

+0

파이썬 버전은'2.7'입니다. 기계는 피라미드 언급 [여기] (http://www.spoj.com/clusters/)입니다. 그게 충분하지 않다고 나는 동의한다. 비록 내가 OS를 알고있다 할지라도, 여기에 어떤 영향이 있을지 모른다. –