2012-12-24 47 views
0

最近我讀到一個非常緊湊的方式產生質數列表,在PythonPython的:一個緊湊的方式在給定的範圍內產生質數

#'prime' should be a pre-defined upper bound of the range 
filter(lambda prime:all(prime%num for num in range(2,prime)),range(2,prime)) 

什麼proscons這個適應生成素數?是Pythonic嗎?

我個人的想法是它還挺可讀和非常簡單的,我不知道這是否是代碼的好辦法,而且我不積極,代碼是有效的

+1

你應該發佈你認爲是正反兩方面的東西。 – asheeshr

+0

「Pythonic」是主觀的,就像「面向對象」或「優雅」。 –

+0

這可能更適合codereview.stackexchange.com –

回答

3

prime = 10000對於該代碼執行78021個區劃,而傳統的方法需要不超過2302

http://ideone.com/X0MhGO

你的方法可通過僅檢查奇數和在sqrt(x)停止加以改進:

primes = [2] + filter(lambda p: all(p % n for n in range(3, int(sqrt(p)) + 1, 2)), range(3, max, 2)) 

這比「傳統」算法還差,但比原來的算法要好得多(2351個div vs 78021)。

+0

中可能會將我鏈接到傳統的方法,你指的是? Cuz基於我讀的代碼,即使我們只考慮奇數,也有〜5000個數字,我們必須逐個檢查分頻器,直到所有數字的平方根。 –

+0

@ChenXie:我添加了鏈接到ideone。問題是,你只需要檢查一個數字是否與_primes_ <= sqrt(x),而不是針對_all_數字 georg

0

缺點:發電機會是一個更好的選擇。我也覺得它很慢。

優點:它將所有素數放入列表中,我想這是一個優點。

以下是我在質數附近使用的functions

+0

/prime-numbers-in-python感謝您分享代碼,這是生成素數的足夠好方法。根據[Wikipedia](http://en.wikipedia.org/wiki/Prime_number),似乎只有正數可以是質數,僅供參考 –

+0

我想我知道,代碼中有些東西除此以外? – jgritty

0

有更好的方法,該功能是基於這些原因慢:

  • 接一個,當你可以用兩個簡化爲兩個,因爲除了兩位全連號都沒有黃金經過一個

  • 此外,循環一路到最後的數字,當它永遠不會有過去的因素它的平方根

This就是一個例子更好的函數來檢查一個數是否爲素數。

如果您至少在尋找速度,這些是主要問題。

+0

這是一個更好的功能,但它做了一個不同的事情。 – jgritty

+0

@jgritty不,它不。他們做同樣的事情... – jackcogdill

+0

我連接的代碼應該替換'lambda prime:all(prime%num for num in range(2,prime))'在給定的代碼 – jackcogdill

1

優點和缺點主要是算法而不是語法。此代碼使用簡單的方法生成這些素數,雖然您可以對其進行一些優化,但如果遇到性能問題,最好使用well established algorithm。否則,它其實並不重要,但我個人會寫上面的代碼作爲發電機的表達:

(cand for cand in range(2,upper_limit) if all(cand%num for num in range(2,cand))) 

(注:你有兩個不相關的兩個變量命名爲原來的代碼prime,所以我改名爲他們我看到了適合)

+1

OP的代碼是** not **使用篩子。它正在使用天真的審判分裂。 –

+0

@DanielFischer你是對的!現在我發現我完全誤解了代碼,並且儘管有一個上限(各種篩子的共同特徵),但它並沒有以任何方式利用它,從頭開始每個新候選人。答案已更新 – mgibsonbr

相關問題