2013-10-13 3 views
1

(기능 프라임 안에) 다음 프로그램의 실행 시간이 222.006502634 초이 프로그램의 효율성을 높이는 방법은 무엇입니까?

내가 만든이 시간을 실행중인 함수 (주요)에 포장없이 110.726383227 초

내가 같은 프로그램을 실행하면

을이다 그것을 함수에 랩핑함으로써 상당한 성능 향상을 가져 왔습니다.

이 프로그램의 효율성이 여전히 향상 될 가능성이 있습니까?

# This is a program to find sum of prime numbers till 2 billion 

def prime(): 
import time 
start_time = time.clock() 

num = 2 
j=1 
tot_sum = 0 

for num in xrange(2,2000000): 
    count = 0 
    for j in xrange(1,int(num**0.5)+1): # checking from 1 to sqrt(n)+1 
     if(num % j == 0): 
      count = count+1 

    if(count == 1): 
     tot_sum = tot_sum + num 

print "total sum is %d" % tot_sum 

print time.clock() - start_time, "seconds" 
+0

사용'테스트 프로그램의 타이밍에 timeit' 모듈하지'time.clock을()'. –

+0

@hcwhsa'timeit'은 훌륭하지만 단일 실행에 몇 분이 걸리는 경우에는 비실용적입니다. 작은 스 니펫을 위해 설계되었습니다. 'timeit'을 사용하여 단일 실행을 시간 측정하는 것은 쓸모가 없습니다 (더 나은 스톱워치를 사용하지만이 시간 규모에서는 거의 유용하지 않습니다). – delnan

+0

로컬 네임 스페이스 (STORE_NAME 명령)가 아닌 로컬 네임 스페이스 (STORE_FAST 명령) 만 처리해야하기 때문입니다. 로컬 네임 스페이스는 전역 네임 스페이스가 이름과 개체를 RAM에 저장하는 동안 레지스터를 사용합니다. 나는 틀릴 수 있었다. – Shashank

답변

1

, 몇 가지 명백한 개선은 할 수있다 :

def prime(): 
    import time 
    start_time = time.clock() 

    tot_sum = 2 

    for num in xrange(3, 2000000, 2): 
      isPrime = True 
      for j in xrange(3, int(num ** 0.5) + 1, 2): 
       if(num % j == 0): 
        isPrime = False 
        break 

      if isPrime: 
       tot_sum = tot_sum + num 

    print "total sum is %d" % tot_sum 

    print time.clock() - start_time, "seconds" 

prime() 

이 2 개보다 큰 짝수을 확인하지 하나를 찾을 경우 모든 제수를 확인하지. 내 코드가 내 컴퓨터에서 172.924809 초, 광산이 8.492169 초에서 실행됩니다. 외부 libs와 사용하는 것은 허용되는 경우

, 내가 gmpy2을 건의 할 것입니다 :

def prime(): 
    from gmpy2 import is_prime 
    import time 
    start_time = time.clock() 

    print "total sum is %d" % (sum(filter(is_prime, xrange(3,2000000,2)))+2) 

    print time.clock() - start_time, "seconds" 

prime() 

이 실행 1.691812 초

0

이것은 파이썬이 변수를 해결하는 방법과 관련이 있습니다. 대략, 함수를 입력하면, 파이썬은 새로운 네임 스페이스를 생성합니다.이 네임 스페이스는 본질적으로 그 함수의 모든 변수에 매핑됩니다. 그런 다음 파이썬은 네임 스페이스를 사용하여 프로그래머가 액세스하는 모든 변수의 값을 결정할 수 있습니다. 다음과 같이 변수 이름 확인의 순서는 다음과 같습니다 파이썬의 내장 인 글로벌 네임 스페이스에있는 지역 이름 공간

  • 조회 변수 이름에

    • 조회 변수 이름
    • 조회 이름입니다.

    조회를 수행하는 것이 비용이 많이 들고, 파이썬의 일반적인 성능 팁은 바로 이런 이유 때문에 use local variables입니다. 최소한 하나가 아닌 두 번의 조회를 피할 것입니다. 또한 새로운 python 컴파일러는 심지어 lookup into the local namespace 단일 요소를 제거하기 위해 추가 최적화를 수행하는 것처럼 보이지만 변수를 즉시 값으로 처리합니다.

    네임 스페이스 조회만으로이 최적화가 수행되는지 여부를 테스트하는 좋은 방법은 함수에 모든 논리를 래핑하는 것뿐 아니라 (내가 모르는 다른 최적화를 제외하고) 글로벌을 사용합니다. 모든 것이 느려지면 너무 많은 시간이 걸리는 네임 스페이스 조회라고 생각할 수 있습니다. 외부 libs가없이 그것을 해결하려면

  • 관련 문제