我有一個串列理解,可以列印從 1 到 1000 的所有質數。出于某種奇怪的原因,我的串列理解需要 1:46 才能在終端中加載。我覺得這很奇怪,因為當我正常寫出相同的代碼時,它會立即加載。
這是我的理解:print([x for x in range(2, 1000) if x not in [y * z for y in range(2, 1001) for z in range(2, 1001)if y * z < 1000]])
如您所見,它列出了 2 和 1000 中的數字串列,并列印了不在 1000 以下合數串列中的(素數)。當我運行它時,它會正確輸出,但需要在我嘗試的每臺計算機上都會老化。我想也許我的代碼是錯誤的。但是,當我隔離[y * z for y in range(2, 1001) for z in range(2, 1001)if y * z < 1000]線時,顯示復合材料沒有延遲。當我生成用于比較的常規數字串列時,也沒有滯后。只是當我使用“not in”運算子時,理解需要很長時間才能列印出來。
我想也許不是比較是特別慢。但令我沮喪的是,我注意到當我正常而不是理解地寫出代碼的比較部分時,絕對沒有延遲。看到這個:
x = [y * z for y in range(2, 1001) for z in range(2, 1001)if y * z < 1000]
newlist = []
for z in range(2, 1000):
if z not in x:
newlist.append(z)
print(newlist)
如您所見,我將復合串列放入一個變數中,并定期執行 if 陳述句和回圈。如果 x 不在串列中,則將其添加到新串列中。實作與我的串列理解相同的目標。我想知道,是否有解決我的串列理解如此緩慢的方法。邏輯與我最初的理解相匹配,那么如果理解格式基本相同,為什么它需要更長的時間?
請盡量不要在我的代碼中添加任何附加功能,我將嘗試使用串列理解并且僅使用串列理解。
uj5u.com熱心網友回復:
內部串列是重新創建在每個迭代上的x。簡單地把它分開:
composites = [y*z for y in range(2, 1001) for z in range(2, 1001) if y*z < 1000]
[x for x in range(2, 1000) if x not in composites]
順便說一下,如果你做composites一個集合,查找(in和not in)要快得多(O(1)而不是O(n),其中n=len(composites))。
composites = {y*z for y ...}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/322317.html
