Improve the sieve() recipe in the itertools docs #109199
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The old version fully marked the entire primes table before yielding its first value. Now subsequences of primes are yielded as soon as the subsequence becomes fully marked. This improves responsiveness — the first call to
next()
returns more quickly. And since the work is done lazily, the factor() recipe saves work when small factors reduce the search space. For examplefactor(12**20)
is now several times faster.The old version did some perplexing manipulations to the data array,
data[:3] = 0, 0, 0
anddata[2] = 1
. The new version is straight forward and has clean loop invariants:data[start : p*p]
has valid primes that have not yet been yieldeddata[p*p : n]
still needs to be marked for multiples ofp
.The new version is easy experiment with and can be easily changedto the simplest version of the algorithm that isn't lazy and hasn't optimized away the even composites.
📚 Documentation preview 📚: https://cpython-previews--109199.org.readthedocs.build/