[英]Optimizing a prime number generator in Python
我正在尋找有關優化素數生成器的任何建議。 您能否附上更正內容,並附上一些簡短評論,說明其回復速度更快的原因。
def primeList ( highestNumber ):
""" This function takes a integer and returns a list of all primes less than or equal to that integer"""
numbers = range( 2, highestNumber + 1 ) # creates an inclusive list of all numbers between 2 and highestNumber
isPrime = [ True ] * len( numbers ) # each element corresponds to an element in numbers and keeps track of whether or not it is prime
primes = [] # Where I'll build a list of prime numbers
for i in range( len( numbers ) ):
if ( isPrime[i] == True ):
increment = numbers[i]
position = i + increment
primes.append( numbers[ i ] )
while ( position < len( numbers )): # will only execute if the above if statement is true because position will still be greater than len( number )
isPrime[position] = False # Sets an element of isPrime to False if it is a multiple of a lower number
position += increment
return primes
您可以從“數字”列表中刪除大於2的偶數,因為這些偶數肯定不是質數,因此您不必檢查它們。 您可以通過設置范圍功能的step參數來實現。
def primeList ( highestNumber ):
""" This function takes a integer and returns a list of """
""" all primes less than or equal to that integer"""
numbers = range( 3, highestNumber + 1, 2 )
isPrime = [ True ] * len( numbers )
primes = [2] if highestNumber >= 2 else []
for number in numbers:
if ( isPrime[(number-3)/2] ):
increment = number
position = (number * number - 3) / 2
if ( position >= len( numbers )):
primes += (x for x in numbers[(number-3)/2:]
if isPrime[(x-3)/2])
# primes += (2*i+3 for i in xrange((number-3)/2,
# len(numbers)) if isPrime[i])
break
else:
primes.append( number )
while ( position < len( numbers )):
isPrime[position] = False
position += increment
return primes
僅在賠率上工作更快,並且占用空間更少。
我們可以從n*n
開始消除n
的倍數,因為對於任何n*k
, k < n
,我們有n*k = k*n
即它將被消除為k
的倍數。
只要正方形在頂部上方,我們就可以停止-此時,所有倍數都已經在isPrime
列表中標記了。
計算素數的最簡單方法是使用篩子。 它是由希臘數學家Eratosthenes於2000年前發明的:
def primes(n):
sieve = [True] * (n+1)
ps = []
for p in range(2,n):
if sieve[p]:
for i in range(p*p, n, p):
sieve[i] = False
ps.append(p)
return ps
有更快的方法來計算質數,但是除非通過測量得知應用程序需要比上述功能更快的速度,或者沒有足夠的內存來存儲篩子,否則應使用此方法,該方法既簡單又困難弄錯了。 如果您想了解有關Eratosthenes篩網的更多信息,請在我的博客中謙虛地推薦“ 用質數編程 ”一文。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.