2014-06-13 3 views
0

나는이 파이썬 코드를 가지고 소수를 생성합니다. 약간의 코드 조각 (# Start progress code# End progress code 사이)을 추가하여 작업 진행률을 표시했지만 작업 속도가 느려졌습니다.파이썬 디스플레이 진행

#!/usr/bin/python 

a = input("Enter a number: ") 
f = open('data.log', 'w') 

for x in range (2, a): 
    p = 1 
    # Start progress code 
    s = (float(x)/float(a))*100 
    print '\rProcessing  ' + str(s) + '%', 
    # End progress code 
    for i in range(2, x-1): 
    c = x % i 
    if c == 0: 
     p = 0 
     break 
    if p != 0: 
    f.write(str(x) + ", ") 

print '\rData written to \'data.log\'. Press Enter to exit...' 

raw_input() 

내 질문은 실제 코드/루프 속도를 늦추지 않고 작업 진행 상황을 보여주는 방법입니다. 미리 감사드립니다 ;-)

+0

얼마나 느리게 했습니까? 나는 당신이 그것에 대해 기술적 인 것을 원한다면 무언가를 늦추지 않고 작업을 추가 할 수없고 화면에 인쇄하는 데 많은 비용이 드는 경향이 있다고 생각합니다. – Engineero

+0

https://github.com/rasbt/pyprind – Emre

답변

1

질문에 대한 답변을 얻으려면 I/O가 매우 비쌉니다. 따라서 진행 상황을 인쇄하면 성능에 큰 영향을 미칩니다. 가능하다면 인쇄를 피할 것입니다.

속도가 걱정된다면 으로 크게 코드를 빠르게 사용할 수 있습니다. 루프 내부 당신을 위해

, 대신

for i in range(2, x-1): 
    c = x % i 
    if c == 0: 
     p = 0 
     break 

사용

당신은 당신이 소수성 테스트하는 숫자의 제곱근 2의 범위에서 반복 할 필요가
for i in range(2, x-1**(1.0/2)): 
    c = x % i 
    if c == 0: 
     p = 0 
     break 

.

이 최적화를 사용하면 성능 저하로 인해 인쇄가 중단되는 것을 상쇄 할 수 있습니다.

+0

도움 주셔서 감사합니다;) –

1

내부 루프는 O (n) 시간입니다. 엄청난 숫자로 지연되는 경우 꽤 정상입니다. 또한 나누기를 수행하는 동안 x와 a를 실수로 변환합니다. 그들이 커지면 프로세스 속도가 느려질 수 있습니다.

0

처음에는 전체 작업이 O (n^2) 인 것처럼 (빠른 눈으로 보았 기 때문에) 장난감 문제라고 생각합니다.

당신은 아마 상단에 넣어 둘 : 당신이 말하는대로 (너무 오래 걸릴 것 때문에

각 반복이 저렴 거대한 루프에 대한 일반적
from __future__ import division # Make floating point division the default and enable the "//" integer division operator. 

가 진행 출력마다 반복되지 않습니다 체험). 고정 된 횟수 또는 출력 사이의 고정 된 시간과 중 출력 진행 상황을보십시오 :

N_OUTPUTS = 100 
OUTPUT_EVERY = (a-2) // 5 
... 
    # Start progress code 
    if a % OUTPUT_EVERY == 0: 
     print '\rProcessing  {}%'.format(x/a), 
    # End progress code 

또는 대신 시간에 가고 싶은 경우 : 조금 더 비싼 것

UPDATE_DT = 0.5 
import time 
t = time.time() 
... 
    # Start progress code 
    if time.time() - t > UPDATE_DT: 
     print '\rProcessing  {}%'.format(x/a), 
     t = time.time() 
    # End progress code 

, 하지만 내부 루프가 느려지더라도 둘 이상의 반복 또는 0.5 초 중 어 떤 시간이 더 오래 걸릴지 어둠에 머물러 있지 않도록 보장합니다.