2014-11-20 5 views
1

파이썬을 사용하여 소수 계산기를 만들려고합니다. 필자는 순차적 인 버전을 만들었지 만 병렬화해야합니다.2 스레드를 사용하여 파이썬에서 n 번째 소수를 계산하십시오.

요구 사항 : 프라임 번호가 새로 기능을 대신 에 의해 계산해야

  1. 어딘가에 보았다된다.


한 빨리 계산

  • 프로그램이어야에 기여 2 개 실이 있어야 지금 내가 가지고있는 코드는 다음과 같습니다

    import sys 
    import math 
    import cProfile 
    
    def is_prime(num): 
        for j in range(2,int(math.sqrt(num)+1)): 
         if (num % j) == 0: 
          return False 
        return True 
    
    def prime(nth): 
        """Return the nth prime number. 
        >>> prime(3) 
        The 3th prime number is: 5 
        >>> prime(4) 
        The 4th prime number is: 7 
        >>> prime(1000) 
        The 1000th prime number is: 7919 
        """ 
        i = 0 
        num = 2 
    
        while i < nth: 
         if is_prime(num): 
          i += 1 
          if i == nth: 
           print('The ' + str(nth) + 'th prime number is: ' + str(num)) 
         num += 1 
    
    if __name__ == "__main__": 
        import doctest 
        doctest.testmod() 
        cProfile.run('print(prime(1000))') 
    
  • +0

    코드가 좋아 보인다. 문제가 무엇입니까? 또한 1000으로 소수를 찾고자한다면 2.와 3.는 상호 배타적이라고 생각합니다. – User

    답변

    0

    이것은 내가 현재 가지고있는 대답이다.

    import threading, doctest, cProfile, time, random 
    result = [2] 
    counter = 1 
    
    def get_int(num): 
        for i in range(3, num): 
         yield i 
    
    def is_prime(num): 
        for j in range(2,int(num)): 
         if (num % j) == 0: 
          return False 
        result.append(num) 
        return True 
    
    def prime_calculator(nth): 
        lock = threading.Lock() 
        global result, counter, integer 
        while counter < (nth): 
         if is_prime(next(integer)): 
          lock.acquire() 
          try: 
           counter += 1 
          finally: 
           lock.release() 
         time.sleep(random.random()/1000) 
    
    def prime(nth): 
        """Returns the nth prime number 
        >>> prime(1) 
        2 
        >>> prime(2) 
        3 
        >>> prime(4) 
        7 
        >>> prime(1000) 
        7919 
        """ 
        global integer, counter, result 
        integer = get_int(99999999) 
        threads = [threading.Thread(daemon=True, target=prime_calculator, args=(nth,)) for i in range(2)] 
        [thread.start() for thread in threads] 
        [thread.join() for thread in threads] 
        counter = 1 
        return result[-1] 
    
    if __name__ == "__main__": 
        doctest.testmod() 
        cProfile.run('print(prime(1000))') 
    

    그러나 카운터를 사용하므로 스레드로부터 안전하지 않으므로 나중에 카운터없이 수행하려고합니다.

    관련 문제