Là Python, thường tốt hơn là trả về một trình tạo sẽ trả về một chuỗi số nguyên tố vô hạn thay vì một danh sách.
ActiveState có một danh sách các Sieve cũ của Eratosthenes recipes
Dưới đây là một trong số họ cập nhật để Python 2.7 sử dụng itertools count với một đối số bước mà không tồn tại khi các công thức ban đầu được viết:
import itertools as it
def sieve():
""" Generate an infinite sequence of prime numbers.
"""
yield 2
D = {}
for q in it.count(3, 2): # start at 3 and step by odds
p = D.pop(q, 0)
if p:
x = q + p
while x in D: x += p
D[x] = p # new composite found. Mark that
else:
yield q # q is a new prime since no composite was found
D[q*q] = 2*q
Vì nó là một bộ tạo nên nó hiệu quả hơn nhiều so với việc tạo ra toàn bộ danh sách. Kể từ khi nó nằm tổng hợp, nó là tính toán hiệu quả là tốt.
Run này:
>>> g=sieve()
Sau đó, mỗi cuộc gọi tiếp theo trả về thủ tiếp theo:
>>> next(g)
2
>>> next(g)
3
# etc
Sau đó bạn có thể nhận được một danh sách giữa ranh giới (ví dụ, Thủ khoá X từ người đầu tiên X + Y nguyên tố ...) bằng cách sử dụng islice:
>>> tgt=0
>>> tgt, list(it.islice(sieve(), tgt, tgt+10))
(0, [2, 3, 5, 7, 11, 13, 17, 19, 23, 29])
>>> tgt=1000000
>>> tgt, list(it.islice(sieve(), tgt, tgt+10))
(1000000, [15485867, 15485917, 15485927, 15485933, 15485941, 15485959, 15485989, 15485993, 15486013, 15486041])
Bạn có thể xem câu hỏi này: http://stackoverflow.com/questions/567222/simp le-prime-generator-in-python – ashwinjv
Điều này có hiệu quả nếu số đó là 9 không? Mục đích của biến truy cập là gì? PS: 'a = a + 1' có thể được đơn giản hóa thành' a + = 1' – pygeek
Đặc biệt là việc thực hiện sàng lọc Erastothenes trong câu trả lời được chấp nhận (http://stackoverflow.com/a/568618/3646530). Nó liên quan đến việc sử dụng máy phát điện. Bạn có thể xem thêm thông tin về máy phát điện ở đây: http://stackoverflow.com/a/231855/3646530 – ashwinjv