Hướng dẫn how do you check a large number is prime or not in python? - Làm thế nào để bạn kiểm tra một số lớn có phải là số nguyên tố hay không trong python?

Dưới đây là việc tôi thực hiện thử nghiệm nguyên thủy Miller-Rabin; Nó mặc định là 5 thử nghiệm ngẫu nhiên, nhưng bạn có thể điều chỉnh nó như mong muốn. Vòng lặp trên P là một sự trở lại nhanh chóng cho các số nguyên tố nhỏ.

def isPrime(n, k=5): # miller-rabin
    from random import randint
    if n < 2: return False
    for p in [2,3,5,7,11,13,17,19,23,29]:
        if n % p == 0: return n == p
    s, d = 0, n-1
    while d % 2 == 0:
        s, d = s+1, d/2
    for i in range(k):
        x = pow(randint(2, n-1), d, n)
        if x == 1 or x == n-1: continue
        for r in range(1, s):
            x = (x * x) % n
            if x == 1: return False
            if x == n-1: break
        else: return False
    return True

Lớp ProcessPoolExecutor trong Python có thể được sử dụng để kiểm tra xem nhiều số có phải là số nguyên tố cùng một lúc không.ProcessPoolExecutor class in Python can be used to check if multiple numbers are prime at the same time.

Điều này có thể tăng tốc đáng kể chương trình của bạn so với việc kiểm tra xem các số là số nguyên tố, từng người một.

Trong hướng dẫn này, bạn sẽ khám phá cách kiểm tra xem các số có đồng thời sử dụng một nhóm quy trình công nhân không.check if numbers are prime concurrently using a pool of worker processes.

Sau khi hoàn thành hướng dẫn này, bạn sẽ biết:

  • Cách kiểm tra các yếu tố cho các số nguyên tố từng người một trong Python và mức độ chậm của nó.
  • Cách sử dụng ProcessPoolExecutor để quản lý một nhóm các quy trình công nhân.ProcessPoolExecutor to manage a pool of worker processes.
  • Cách sử dụng ProcessPoolExecutor để kiểm tra số nguyên tố đồng thời.ProcessPoolExecutor to check for prime numbers concurrently.

Hãy để lặn trong.

  • Cách kiểm tra xem các số có phải là một nguyên tố không (chậm)
    • Kiểm tra tính nguyên thủy trong Python
    • Kiểm tra tính nguyên thủy cho một loạt các số
    • Kiểm tra số lượng rất lớn cho tính nguyên thủy
  • Cách kiểm tra xem nhiều số có đồng thời không
  • Phần mở rộng
  • Đọc thêm
  • Takeaways

Cách kiểm tra xem các số có phải là một nguyên tố không (chậm)

Kiểm tra tính nguyên thủy trong Python

Kiểm tra tính nguyên thủy cho một loạt các số

Kiểm tra số lượng rất lớn cho tính nguyên thủy

Cách kiểm tra xem nhiều số có đồng thời không

Phần mở rộngProcessPoolExecutor in Python.

Đọc thêm

Takeaways

Kiểm tra tính nguyên thủy trong Python

Kiểm tra tính nguyên thủy cho một loạt các số

Kiểm tra số lượng rất lớn cho tính nguyên thủy

Cách kiểm tra xem nhiều số có đồng thời không

  • Phần mở rộng
  • Đọc thêm
  • Takeaways
  • Một số nguyên tố là một số nguyên dương chỉ chia hết cho chính nó và một.
  • Nếu một số không phải là số nguyên tố, điều đó có nghĩa là có ít nhất một bộ chia khác cho số và chúng ta có thể đề cập đến số về mặt kỹ thuật là có thể là composite composite.

Số nguyên tố là một lĩnh vực hấp dẫn của toán học, nhưng chúng tôi cũng có thể sử dụng chúng thực tế, chẳng hạn như trong mật mã (ví dụ: khóa công khai và riêng tư), tính toán tổng kiểm tra, định cấu hình bảng băm, trình tạo số ngẫu nhiên và nhiều hơn nữa.

Đưa ra một số, chúng ta không thể biết liệu nó có phải là nguyên tố hay không mà không kiểm tra xem liệu nó có bất kỳ ước nào ngoài chính nó và một. Có nhiều thuật toán thông minh để tăng tốc quá trình này, nhưng về cơ bản, các số kiểm tra tính nguyên thủy là một quá trình thủ công và chậm.

Do đó, nó tạo ra một trường hợp tốt để khám phá cách làm cho các chương trình đồng thời bằng cách sử dụng ProcessPoolExecutor trong Python.

Nó thậm chí còn được sử dụng như một ví dụ nhỏ trong tài liệu API ProcessPoolExecutor.

Bắt đầu nào.

Một số là nguyên tố nếu nó là tích cực và chỉ chia hết cho chính nó và một.is_divisible(target,number):

returntarget%number==0target%number==0

Trang Wikipedia cho bài kiểm tra nguyên thủy đưa ra một thuật toán ngây thơ mà chúng ta có thể sử dụng để kiểm tra xem một số là số nguyên tố.

Các bước có thể được tóm tắt như sau:

Nếu số nhỏ hơn 2, không phải là nguyên tố.

foriinrange(2,target):iinrange(2,target):

iftarget%i==0:target%i==0:

Nếu số là 2, Prime.

Nếu số có thể được chia cho 2 không còn lại, không phải là nguyên tố.

Nếu số có ước số giữa 3 và sqrt (n), không phải là nguyên tố

Nếu không, Prime.

iftarget%2==0:target%2==0:

Nếu số là 2, Prime.

Nếu số có thể được chia cho 2 không còn lại, không phải là nguyên tố.

Nếu số có ước số giữa 3 và sqrt (n), không phải là nguyên tốrange() function will take a step size as a third parameter, therefore we can write something like:

Nếu số nhỏ hơn 2, không phải là nguyên tố.

foriinrange(3,target,2):iinrange(3,target,2):

iftarget%i==0:target%i== 0:

Nếu số là 2, Prime.

Nếu số có thể được chia cho 2 không còn lại, không phải là nguyên tố.

Nếu số có ước số giữa 3 và sqrt (n), không phải là nguyên tố

Nếu không, Prime.math.sqrt(target).

Chúng tôi có thể viết một cái gì đó như:

# Kiểm tra xem mục tiêu có chia hết không

foriinrange(3,sqrt(target),2):iinrange(3,sqrt(target),2):

iftarget%i==0:target%i ==0:

# không phải là nguyên tố

# nếu không là Prime

Càng xa càng tốt.

Một vấn đề nhỏ là căn bậc hai có thể không dẫn đến một số nguyên, do đó chúng ta cần làm tròn nó theo một cách nào đó.

Chúng ta có thể lấy toán học.floor () của số sẽ chỉ giữ số nguyên và giảm bất kỳ giá trị phân số nào.math.floor() of the number which will just keep the integer and drop any fractional values.

.....

# Tính giới hạn trên trên các ước số để kiểm tra

limit=floor(sqrt(target))=floor(sqrt(target))

Cuối cùng, chúng tôi thực sự muốn kiểm tra số nguyên là căn bậc hai của mục tiêu, không phải đầu ở một trừ giá trị này, đó là hành vi mặc định của phạm vi (). Do đó, chúng ta có thể thêm một vào giới hạn trên của các ước số để kiểm tra.range(). Therefore, we can add one to this upper limit of divisors to check.

.....

# Tính giới hạn trên trên các ước số để kiểm tra

limit=floor(sqrt(number))+1=floor(sqrt(number))+1

Cuối cùng, chúng tôi thực sự muốn kiểm tra số nguyên là căn bậc hai của mục tiêu, không phải đầu ở một trừ giá trị này, đó là hành vi mặc định của phạm vi (). Do đó, chúng ta có thể thêm một vào giới hạn trên của các ước số để kiểm tra.

# Giới hạn các ước số mà chúng tôi kiểm tra, sqrt của n, +1 sO range () sẽ tiếp cận nóis_prime() function below will take a number and return True if it is prime or False otherwise.

Và điều đó về nó.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

Kết hợp tất cả những điều này lại với nhau, hàm is_prime () bên dưới sẽ lấy một số và trả về true nếu nó là số nguyên tố hoặc sai.

Nó không phải là thuật toán nhanh nhất để kiểm tra tính nguyên thủy, nhưng nó sẽ hoạt động.is_prime(number):

# trả về đúng nếu Prime, sai nếu không# 1 is a special case of not prime

    ifnumberifnumber<=1:

        returnFalsereturn False

def is_prime (số):# 2 is a special case of a prime

    ifnumber==2:ifnumber==2:

        returnTruereturnTrue

& nbsp; & nbsp; & nbsp; & nbsp;# 1 là một trường hợp đặc biệt không phải là nguyên tố# check if the number divides by 2 with no remainder

    ifnumber%2==0:ifnumber%2==0:

        returnFalsereturnFalse

& nbsp; & nbsp; & nbsp; & nbsp;# 2 là một trường hợp đặc biệt của một số nguyên tố# limit on divisors we test, sqrt of n, +1 so range() will reach it

    limit=floor(sqrt(number))+1limit =floor(sqrt(number))+1

& nbsp; & nbsp; & nbsp; & nbsp;# Kiểm tra xem số đó có chia cho 2 không còn còn lại# check for evenly divisible for odd numbers between 3 and sqrt(n)

    foriinrange(3,limit,2):foriin range(3,limit,2):

& nbsp; & nbsp; & nbsp; & nbsp;# giới hạn trên các chia mà chúng tôi kiểm tra, sqrt của n, +1 so ()# check if number is divisible with no remainder

        ifnumber%i==0:ifnumber%i== 0:

& nbsp; & nbsp; & nbsp; & nbsp;# Kiểm tra đều chia đều cho các số lẻ giữa 3 và sqrt (n)# number is divisible and is not a prime

            returnFalsereturnFalse

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# number is probably prime

    returnTruereturnTrue

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

& nbsp; & nbsp; & nbsp; & nbsp;# có lẽ là chính

Kiểm tra tính nguyên thủy cho một loạt các sốcheck_numbers_are_prime() that takes a list of numbers and tests each in turn, reporting if they are prime, and ignoring them if not.

Bây giờ chúng tôi có thể kiểm tra chức năng của chúng tôi trên một số số nguyên tố ứng cử viên.

Hãy để xác định một hàm Check_numbers_are_prime () có một danh sách các số và kiểm tra lần lượt, báo cáo nếu chúng là chính và bỏ qua chúng nếu không.

Đây là một trường hợp sử dụng điển hình, trong đó chúng tôi quan tâm đến những con số nào là nguyên tố, không phải là một số nhất định có phải là số nguyên tố hay không.

Các chức năng được liệt kê dưới đây.check_numbers_are_prime(numbers):

# Kiểm tra xem một loạt các số có chính hay không# check each number in turn

Def Check_numbers_are_prime (số):fornumber innumbers:

        ifis_prime(number):if is_prime(number):

& nbsp; & nbsp; & nbsp; & nbsp;# Kiểm tra từng sốprint(f'{number} is prime')

& nbsp; & nbsp; & nbsp; & nbsp; fornumber innumbers:

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

Tiếp theo, hãy để thử nghiệm nó trên một số số nguyên tố đã biết.

Danh sách trang Wikipedia của các số nguyên tố cung cấp nhiều danh sách các số nguyên tố mà chúng ta có thể sử dụng để thử nghiệm.

Điều quan trọng, nó có một danh sách tất cả các số nguyên tố trong khoảng từ 1 đến 1.000.check_numbers_are_prime() function with a list of all integers between 1 and 100 from the program entry point.

Hãy để chạy 1 ném 100 thông qua chức năng thử nghiệm chính của chúng tôi và xác nhận rằng nó có thể phát hiện chúng.

if__name__=='__main__':__name__=='__main__':

Hãy để chức năng gọi cho Check_numbers_are_prime () của chúng tôi với danh sách tất cả các số nguyên từ 1 đến 100 từ điểm nhập chương trình.# define some numbers to check

    NUMBERS=list(range(1,101))NUMBERS= list(range(1,101))

# Điểm vào# check whether each number is a prime

    check_numbers_are_prime(NUMBERS)check_numbers_are_prime(NUMBERS)

& nbsp; & nbsp; & nbsp; & nbsp;# xác định một số số để kiểm tra

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

& nbsp; & nbsp; & nbsp; & nbsp;# kiểm tra xem mỗi số có phải là số nguyên tố không

Tying này lại với nhau, ví dụ hoàn chỉnh được liệt kê dưới đây.

# SuperfastPython.commath import sqrt

# Báo cáo tất cả các số nguyên tố từ 1 đến 100math import floor

Kết hợp tất cả những điều này lại với nhau, hàm is_prime () bên dưới sẽ lấy một số và trả về true nếu nó là số nguyên tố hoặc sai.

Nó không phải là thuật toán nhanh nhất để kiểm tra tính nguyên thủy, nhưng nó sẽ hoạt động.is_prime(number):

# trả về đúng nếu Prime, sai nếu không# 1 is a special case of not prime

    ifnumberifnumber<=1:

        returnFalsereturnFalse

def is_prime (số):# 2 is a special case of a prime

    ifnumber==2:ifnumber ==2:

        returnTruereturnTrue

& nbsp; & nbsp; & nbsp; & nbsp;# 1 là một trường hợp đặc biệt không phải là nguyên tố# check if the number divides by 2 with no remainder

    ifnumber%2==0:ifnumber%2== 0:

        returnFalsereturnFalse

& nbsp; & nbsp; & nbsp; & nbsp;# 2 là một trường hợp đặc biệt của một số nguyên tố# limit on divisors we test, sqrt of n, +1 so range() will reach it

    limit=floor(sqrt(number))+1limit=floor(sqrt(number)) +1

& nbsp; & nbsp; & nbsp; & nbsp;# Kiểm tra đều chia đều cho các số lẻ giữa 3 và sqrt (n)# check for evenly divisible for odd numbers between 3 and sqrt(n)

    foriinrange(3,limit,2):foriinrange(3,limit,2):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# check if number is divisible with no remainder

        ifnumber%i==0:ifnumber%i==0:

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# number is divisible and is not a prime

            returnFalsereturn False

& nbsp; & nbsp; & nbsp; & nbsp;# có lẽ là chính# number is probably prime

    returnTruereturnTrue

# Kiểm tra xem một loạt các số có chính hay không

Def Check_numbers_are_prime (số):check_numbers_are_prime(numbers):

& nbsp; & nbsp; & nbsp; & nbsp;# Kiểm tra từng số# check each number in turn

& nbsp; & nbsp; & nbsp; & nbsp; fornumber innumbers:for number innumbers:

        ifis_prime(number):ifis_prime(number):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;print(f'{number} is prime')

# Điểm vào

if__name__=='__main__': __name__=='__main__':

& nbsp; & nbsp; & nbsp; & nbsp;# xác định một số số để kiểm tra# define some numbers to check

    NUMBERS=list(range(1,101))NUMBERS=list(range(1,101))

& nbsp; & nbsp; & nbsp; & nbsp;# kiểm tra xem mỗi số có phải là số nguyên tố không# check whether each number is a prime

    check_numbers_are_prime(NUMBERS)check_numbers_are_prime(NUMBERS)

Chạy ví dụ khóa kéo qua các số từ 1 đến 100 và kiểm tra từng loại nguyên thủy.

Số ứng cử viên sau đó được báo cáo.

Nếu chúng tôi kiểm tra danh sách này so với danh sách trên trang Wikipedia, chúng tôi có thể xác nhận rằng tất cả các số được báo cáo là nguyên tố và không có số phi chính trị nào được báo cáo.

Càng xa càng tốt.

Thử nghiệm với các phạm vi số khác nhau, khi nào nó bắt đầu chậm? Hãy cho tôi biết trong các bình luận dưới đây, tôi rất thích nghe những gì bạn khám phá.
Let me know in the comments below, I’d love to hear what you discover.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

2 là Prime

3 là Prime

5 là Prime

7 là Prime

11 là Prime

13 là Prime

17 là Prime

19 là Prime

23 là Prime

29 là Prime

31 là Prime

37 là Prime

41 là Prime

43 là chính

47 là Prime

53 là chính

59 là Prime

61 là Prime

67 là Prime

71 là Prime

73 là Prime

79 là Prime

83 là chính

89 là Prime

97 là chính

Tiếp theo, hãy để xem xét việc kiểm tra một số số rất lớn rất chậm.

Kiểm tra số lượng rất lớn cho tính nguyên thủy

Kiểm tra số lượng nhỏ như số từ 1 đến 100 hoặc thậm chí 1 và 1000 rất nhanh.

Kiểm tra tất cả các ước số sử dụng thuật toán ngây thơ của chúng tôi cho các thuật toán lớn là chậm và trở nên tồi tệ hơn khi các con số trở nên lớn hơn.

Ví dụ, một số như 489133282872437279 (là Prime, được lấy từ bài viết Wikipedia) có khoảng 350 triệu yếu tố để kiểm tra và có thể mất một phút để chạy trên phần cứng hiện đại.

Ouch.

Hãy cùng xem xét thử nghiệm một tá ví dụ về số lượng lớn như vậy.

Chúng tôi có thể lấy những con số này từ trang Wikipedia liệt kê một số số nguyên tố rất lớn. Chúng ta cũng có thể làm tăng thêm danh sách với các biến thể của các số nguyên tố đã biết không phải là số nguyên tố, ví dụ: Hủy bỏ, thêm, hoặc thay đổi một chữ số.

Dưới đây là danh sách 17 số nguyên tố ứng cử viên mà chúng ta có thể kiểm tra, 14 trong số đó thực sự là Prime.

.....

# Xác định một số số cần kiểm tra

NUMBERS=[17977,10619863,106198,6620830889,80630964769,228204732751,=[17977,10619863,106198,6620830889,80630964769,228204732751,

    1171432692373,1398341745571,10963707205259,15285151248481,1171432692373, 1398341745571,10963707205259,15285151248481,

    99999199999,304250263527209,30425026352720,10657331232548839,99999199999,304250263527209,30425026352720,10657331232548839,

    10657331232548830,  44560482149,1746860020068409]10657331232548830,  44560482149, 1746860020068409]

Ví dụ hoàn chỉnh với danh sách các số được cập nhật này để kiểm tra tính nguyên thủy được liệt kê dưới đây.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

# SuperfastPython.com

# Kiểm tra xem số lượng lớn có phải là số nguyên tố không

Từ nhập khẩu toán học SQRTmath import sqrt

Từ tầng nhập khẩu toán họcmath import floor

# trả về đúng nếu Prime, sai nếu không

def is_prime (số):is_prime(number):

& nbsp; & nbsp; & nbsp; & nbsp;# 1 là một trường hợp đặc biệt không phải là nguyên tố# 1 is a special case of not prime

    ifnumberifnumber<=1:

        returnFalsereturnFalse

& nbsp; & nbsp; & nbsp; & nbsp;# 2 là một trường hợp đặc biệt của một số nguyên tố# 2 is a special case of a prime

    ifnumber==2:ifnumber ==2:

        returnTruereturnTrue

& nbsp; & nbsp; & nbsp; & nbsp;# Kiểm tra xem số đó có chia cho 2 không còn còn lại# check if the number divides by 2 with no remainder

    ifnumber%2==0:ifnumber%2== 0:

        returnFalsereturnFalse

& nbsp; & nbsp; & nbsp; & nbsp;# giới hạn trên các chia mà chúng tôi kiểm tra, sqrt của n, +1 so ()# limit on divisors we test, sqrt of n, +1 so range() will reach it

    limit=floor(sqrt(number))+1limit=floor(sqrt(number)) +1

& nbsp; & nbsp; & nbsp; & nbsp;# Kiểm tra đều chia đều cho các số lẻ giữa 3 và sqrt (n)# check for evenly divisible for odd numbers between 3 and sqrt(n)

    foriinrange(3,limit,2):foriinrange(3,limit,2):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# check if number is divisible with no remainder

        ifnumber%i==0:ifnumber%i==0:

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# number is divisible and is not a prime

            returnFalsereturn False

& nbsp; & nbsp; & nbsp; & nbsp;# có lẽ là chính# number is probably prime

    returnTruereturnTrue

# Kiểm tra xem một loạt các số có chính hay không

Def Check_numbers_are_prime (số):check_numbers_are_prime(numbers):

& nbsp; & nbsp; & nbsp; & nbsp;# Kiểm tra từng số# check each number in turn

& nbsp; & nbsp; & nbsp; & nbsp; fornumber innumbers:for number innumbers:

        ifis_prime(number):ifis_prime(number):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;print(f'{number} is prime')

        else:else:

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;print(f'{number} is not prime')

# Điểm vào

if__name__=='__main__':__name__=='__main__':

& nbsp; & nbsp; & nbsp; & nbsp;# xác định một số số để kiểm tra# define some numbers to check

    NUMBERS=[17977,10619863,106198,6620830889,80630964769,228204732751,NUMBERS =[17977,10619863,106198,6620830889,80630964769,228204732751,

        1171432692373,1398341745571,10963707205259,15285151248481,1171432692373,1398341745571, 10963707205259,15285151248481,

        99999199999,304250263527209,30425026352720,10657331232548839,99999199999,304250263527209,30425026352720,10657331232548839,

        10657331232548830,  44560482149,1746860020068409]10657331232548830,  44560482149, 1746860020068409]

& nbsp; & nbsp; & nbsp; & nbsp;# kiểm tra xem mỗi số có phải là số nguyên tố không# check whether each number is a prime

    check_numbers_are_prime(NUMBERS)check_numbers_are_prime(NUMBERS)

Chạy các thử nghiệm ví dụ nếu mỗi số là số nguyên tố.

Chúng ta có thể thấy rằng 14 số nguyên tố được xác định chính xác.

Điều quan trọng, quá trình này tương đối chậm, mất khoảng 7,1 giây trên phần cứng hiện đại.

Điều này sẽ ngày càng tồi tệ hơn khi chúng ta thêm nhiều số hoặc số lớn hơn nữa.

Ví dụ đã mất bao lâu để chạy trên hệ thống của bạn?

17977 là Prime

10619863 là chính

6620830889 là chính

80630964769 là chính

228204732751 là chính

1171432692373 là chính

1398341745571 là chính

10963707205259 là chính

15285151248481 là chính

99999199999 là chính

304250263527209 là chính

10657331232548839 là chính

44560482149 là chính

1746860020068409 là chính

Chúng tôi có thể cập nhật chương trình kiểm tra tính nguyên thủy của mình để sử dụng trực tiếp ProcessPoolExecutor với rất ít thay đổi.ProcessPoolExecutor directly with very little change.

Ví dụ: mỗi cuộc gọi đến hàm is_prime () có thể được gửi dưới dạng một nhiệm vụ không đồng bộ cho nhóm quy trình.is_prime() function could be submitted as an asynchronous task to the process pool.

Điều này có nghĩa là nhiệm vụ tổng thể không thể hoàn thành nhanh hơn nhiệm vụ chậm nhất, nhưng nó có khả năng nhanh hơn nhiều so với trường hợp nối tiếp ở trên nếu hầu hết các tác vụ nhanh để hoàn thành, ví dụ: Những con số có kích thước khiêm tốn như số chúng tôi đang thử nghiệm.

Nếu chúng tôi đang thử nghiệm các con số lớn hơn đáng kể, chúng tôi có thể cần sử dụng một chiến lược thay thế.

Ví dụ: thay vì kiểm tra một số dưới dạng tác vụ song song, chúng ta có thể chia các ước số cho mỗi số thành các tác vụ để giảm thời gian kiểm tra từng số. Điều này có thể gây khó khăn trong việc đóng cửa tất cả các nhiệm vụ sau khi tính nguyên thủy được thiết lập.

Tuy nhiên, chúng tôi có hai tùy chọn để gửi các cuộc gọi đến is_prime () vào nhóm quy trình: chúng tôi có thể sử dụng SOUST () hoặc MAP ().is_prime() into the process pool: we could use submit() or map().

Sử dụng Substem () sẽ cho phép chúng tôi báo cáo kết quả khi chúng có sẵn bằng cách sử dụng as_completed (), trong khi bản đồ () sẽ yêu cầu chúng tôi báo cáo kết quả theo thứ tự các số được gửi đến nhóm.submit() would allow us to report results as they became available using as_completed(), whereas map() would require us to report results in the order that numbers are submitted to the pool.

Hàm is_prime () trả về một giá trị đúng hoặc giả chỉ cho một số. Cả Substem () và Map () đều yêu cầu một cách liên kết kết quả của nhiệm vụ với số đã được gửi.is_prime() function returns a True or False value for a number only. Both submit() and map() require a way to associate the result of the task with the number that was submitted.

Trong trường hợp sử dụng Substem (), chúng tôi có thể tạo một ánh xạ các đối tượng trong tương lai đến các số được gửi.submit() we can create a mapping of Future objects to submitted numbers.

Trong trường hợp của map (), chúng ta có thể lặp lại danh sách các số theo cùng thứ tự đã được chuyển đến map ().map() we can iterate the list of numbers in the same order that was passed to map().

Ví dụ: chúng ta có thể sử dụng hàm liệt kê tích hợp () trên kết quả từ MAP () để nhận chỉ mục và sử dụng các số tham chiếu được gửi.enumerate() function on the results from map() to get an index and use that to reference numbers that were submitted.

.....

# Kiểm tra xem số có phải là số nguyên tố không

fori, kết quả inMap (is_prime, số):i,result inmap(is_prime,numbers):

ifresult:result:

print (f '{number [i]} là Prime')(f'{numbers[i]} is prime')

Có lẽ một cách tiếp cận đơn giản hơn là sử dụng hàm zip () tích hợp để lặp lại kết quả từ map () và danh sách các số cùng một lúc, ví dụ::zip() function to iterate the results from map() and the list of numbers at the same time, for example:

.....

# Kiểm tra xem số có phải là số nguyên tố không

fori, kết quả inMap (is_prime, số):number,result inzip(numbers,map(is_prime,numbers)):

    ifresult:if result:

print (f '{number [i]} là Prime')print(f'{number} is prime')

Có lẽ một cách tiếp cận đơn giản hơn là sử dụng hàm zip () tích hợp để lặp lại kết quả từ map () và danh sách các số cùng một lúc, ví dụ::

  • FORNUMBER, kết quả là inzip (số, bản đồ (is_prime, số)):

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;map() function feels like a better fit in this case as we are simply applying a function to a list of items, exactly what map() is designed to achieve.

Nếu bạn chưa quen với các hàm tích hợp tích hợp () và zip (), xem:check_numbers_are_prime() function to use the ProcessPoolExecutor.

Chức năng tích hợp sẵn

.....

# Kiểm tra xem số có phải là số nguyên tố không

fori, kết quả inMap (is_prime, số):ProcessPoolExecutor()asexecutor:

& nbsp; & nbsp; & nbsp; & nbsp;# ...# ...

Sau đó, chúng ta có thể gửi các tác vụ đến nhóm quy trình bằng bản đồ (), một cuộc gọi đến is_prime () cho mỗi số trong danh sách.map(), one call to is_prime() for each number in the list.

Vì có ít hơn 20 nhiệm vụ, chúng tôi không cần phải điều chỉnh đối số của nhóm Chunksize để lập bản đồ () để có được hiệu suất tốt hơn. Điều này có thể được yêu cầu nếu chúng ta có hàng ngàn hoặc hàng triệu mặt hàng trong danh sách.chunksize” argument to map() to get better performance. This might be required if we have thousands or millions of items in the list.

.....

# Gửi các nhiệm vụ

results=executor.map(is_prime,numbers)=executor.map(is_prime,numbers)

Sau đó, chúng ta có thể lặp lại một zip () của các số và kết quả gọi is_prime () cho mỗi số và báo cáo tính nguyên thủy.zip() of the numbers and results of calling is_prime() for each number and report primality.

.....

# Gửi các nhiệm vụ

Sau đó, chúng ta có thể lặp lại một zip () của các số và kết quả gọi is_prime () cho mỗi số và báo cáo tính nguyên thủy.number,isprime inzip(numbers,results):

    ifisprime:ifisprime:

# Báo cáo kết quả theo thứ tựprint(f'{number} is prime')

Fornumber, isprime inzip (số, kết quả):ProcessPoolExecutor is listed below.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

Kết hợp lại với nhau, phiên bản cập nhật của các số kiểm tra cho tính nguyên thủy đồng thời bằng cách sử dụng ProcessPoolExecutor được liệt kê dưới đây.

# SuperfastPython.commath import sqrt

# Kiểm tra xem số lượng lớn có đồng thời khôngmath import floor

Từ nhập khẩu toán học SQRTconcurrent.futures import ProcessPoolExecutor

Từ tầng nhập khẩu toán học

từ đồng thời.is_prime(number):

# trả về đúng nếu Prime, sai nếu không# 1 is a special case of not prime

    ifnumberifnumber<=1:

        returnFalsereturnFalse

def is_prime (số):# 2 is a special case of a prime

    ifnumber==2:ifnumber==2:

        returnTruereturnTrue

& nbsp; & nbsp; & nbsp; & nbsp;# 1 là một trường hợp đặc biệt không phải là nguyên tố# check if the number divides by 2 with no remainder

    ifnumber%2==0:if number%2==0:

        returnFalsereturnFalse

& nbsp; & nbsp; & nbsp; & nbsp;# 2 là một trường hợp đặc biệt của một số nguyên tố# limit on divisors we test, sqrt of n, +1 so range() will reach it

    limit=floor(sqrt(number))+1limit= floor(sqrt(number))+1

& nbsp; & nbsp; & nbsp; & nbsp;# Kiểm tra xem số đó có chia cho 2 không còn còn lại# check for evenly divisible for odd numbers between 3 and sqrt(n)

    foriinrange(3,limit,2):foriinrange(3, limit,2):

& nbsp; & nbsp; & nbsp; & nbsp;# giới hạn trên các chia mà chúng tôi kiểm tra, sqrt của n, +1 so ()# check if number is divisible with no remainder

        ifnumber%i==0:ifnumber%i==0:

& nbsp; & nbsp; & nbsp; & nbsp;# Kiểm tra đều chia đều cho các số lẻ giữa 3 và sqrt (n)# number is divisible and is not a prime

            returnFalsereturnFalse

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# number is probably prime

    returnTruereturnTrue

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

& nbsp; & nbsp; & nbsp; & nbsp;# có lẽ là chínhcheck_numbers_are_prime(numbers):

# Kiểm tra xem một loạt các số có chính hay không# create process pool

Def Check_numbers_are_prime (số):with ProcessPoolExecutor()asexecutor:

& nbsp; & nbsp; & nbsp; & nbsp;# tạo nhóm quy trình# submit the tasks

        results=executor.map(is_prime,numbers)results =executor.map(is_prime,numbers)

& nbsp; & nbsp; & nbsp; & nbsp; với processPoolExecutor ()# report results in order

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;#fornumber,isprime in zip(numbers,results):

            ifisprime:ifisprime:

& nbsp;print(f'{number} is prime')

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

if__name__=='__main__':__name__=='__main__':

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;# define some numbers to check

    NUMBERS=[17977,10619863,106198,6620830889,80630964769,228204732751,NUMBERS=[17977,10619863,106198, 6620830889,80630964769,228204732751,

        1171432692373,1398341745571,10963707205259,15285151248481,1171432692373,1398341745571,10963707205259,15285151248481,

        99999199999,304250263527209,30425026352720,10657331232548839,99999199999, 304250263527209,30425026352720,10657331232548839,

        10657331232548830,  44560482149,1746860020068409]10657331232548830,  44560482149,1746860020068409]

# Điểm vào# check whether each number is a prime

    check_numbers_are_prime(NUMBERS)check_numbers_are_prime(NUMBERS)

& nbsp; & nbsp; & nbsp; & nbsp;# xác định một số số để kiểm tra

& nbsp; & nbsp; & nbsp; & nbsp;# kiểm tra xem mỗi số có phải là số nguyên tố không

Chạy ví dụ kiểm tra danh sách các số cho tính nguyên thủy như chúng ta đã làm trước đây.

Chúng tôi thấy kết quả tương tự, như mong đợi.
Let me know in the comments below.

Trong trường hợp này, chương trình kết thúc trong khoảng một nửa thời gian hoặc khoảng 4,7 giây trên hệ thống của tôi. Đó là khoảng một tốc độ 1,5 lần.

Bạn đã đạt được bao nhiêu tốc độ trên hệ thống của mình? Hãy cho tôi biết trong các ý kiến ​​dưới đây.

17977 là Prime

10619863 là chính

6620830889 là chính

80630964769 là chính

228204732751 là chính

1171432692373 là chính

1398341745571 là chính

10963707205259 là chính

15285151248481 là chính

99999199999 là chính

304250263527209 là chính

10657331232548839 là chính

44560482149 là chính
Download my FREE PDF cheat sheet

1746860020068409 là chính

Bị nhầm lẫn bởi API lớp ProcessPoolExecutor? Tải xuống bảng cheat pdf miễn phí của tôi

  • Phần mở rộng. Update the example to test a large range of numbers with the is_prime() function to confirm it is working correctly, such as all numbers between 1 and 1,000.
  • Kiểm tra tính nguyên thủy cho số lượng lớn hơn. Cập nhật ví dụ để kiểm tra số lượng lớn hơn và báo cáo mất bao lâu để hoàn thành cả serer và đồng thời.. Update the example to test larger numbers and report how long it takes to complete both serially and concurrently.
  • Chia sẻ các giao hàng giữa các công nhân. Cập nhật ví dụ để kiểm tra một số lượng rất lớn cho tính nguyên thủy và chia sẻ các chia để kiểm tra trên nhiều công nhân.. Update the example to test one very large number for primality and share divisors to check across multiple workers.

Chia sẻ các tiện ích mở rộng của bạn trong các ý kiến ​​dưới đây, thật tuyệt khi xem những gì bạn nghĩ ra.


Khóa học Python ProcessPoolExecut miễn phí

Tải xuống bảng Cheat API ProcessPoolExecutor của tôi và như một phần thưởng, bạn sẽ nhận được quyền truy cập miễn phí vào khóa học email 7 ngày của tôi.

Khám phá cách sử dụng lớp ProcessPoolExecutor bao gồm cách định cấu hình số lượng công nhân và cách thực thi các tác vụ không đồng bộ.

Tìm hiểu thêm & NBSP;
 


Đọc thêm

Phần này cung cấp các tài nguyên bổ sung mà bạn có thể thấy hữu ích.

  • Đồng thời.
  • ProcessPoolExecutor: Hướng dẫn đầy đủ
  • Tờ Cheat API lớp ProcessPoolExecutor
  • Câu hỏi phỏng vấn API tương lai đồng thời
  • ProcessPoolExecutor Jump bắt đầu (khóa học 7 ngày của tôi)

Takeaways

Trong hướng dẫn này, bạn đã phát hiện ra cách kiểm tra xem các số có đồng thời sử dụng một nhóm quy trình công nhân không.

  • Cách kiểm tra các yếu tố cho các số nguyên tố từng người một trong Python và mức độ chậm của nó.
  • Cách sử dụng ProcessPoolExecutor để quản lý một nhóm các quy trình công nhân.ProcessPoolExecutor to manage a pool of worker processes.
  • Cách sử dụng ProcessPoolExecutor để kiểm tra số nguyên tố đồng thời.ProcessPoolExecutor to check for prime numbers concurrently.

Bạn có câu hỏi nào không? Để lại câu hỏi của bạn trong một bình luận bên dưới và tôi sẽ trả lời nhanh với lời khuyên tốt nhất của tôi.
Leave your question in a comment below and I will reply fast with my best advice.

Ảnh của Andrew Palmer trên unplash

Làm thế nào để bạn kiểm tra xem một số lượng lớn là số nguyên tố trong Python?

def is_prime (số):..
# 1 là một trường hợp đặc biệt không phải là nguyên tố.Nếu số
# 2 là một trường hợp đặc biệt của một nguyên tố.Nếu số == 2: Trả về đúng ..
# Kiểm tra xem số có chia cho 2 không còn lại.Nếu số % 2 == 0: Trả về sai ..

Làm thế nào để bạn xác định xem một số lượng lớn là số nguyên tố?

Cách dễ nhất để xác định một số nguyên tố là bằng cách tìm các yếu tố của số đã cho.Nếu số có nhiều hơn hai yếu tố, thì đó không phải là số nguyên tố.Tuy nhiên, nếu số đã cho chỉ có hai yếu tố - 1 và chính số, thì đó là số nguyên tố.if the given number has only two factors - 1 and the number itself, then it is a prime number.

Làm thế nào để bạn xác định xem một số là nguyên tố theo cách hiệu quả trong Python?

Chương trình Python cho số nguyên tố khởi tạo một vòng lặp bắt đầu từ 2 kết thúc ở giá trị nguyên của sàn của căn bậc hai của số.Kiểm tra xem số có chia hết cho 2. Lặp lại cho đến khi căn bậc hai của số được kiểm tra không.Trong trường hợp, số là chia hết cho bất kỳ số nào, số không ...