3 回答

TA貢獻1803條經驗 獲得超3個贊
答案取決于您的意見。但是,由于我確實記得一位在Python社區中備受推崇的書的作者提出的一條具體建議,我可以分享Luciano Ramalho的“Fluent Python”一書中的以下摘錄:
for 循環可用于執行許多不同的操作:掃描序列以計數或選取項目,計算聚合(總和、平均值)或任意數量的其他處理任務。[...]相比之下,listcomp只做一件事:構建一個新列表。
當然,濫用列表理解來編寫真正難以理解的代碼是可能的。我見過帶有listcomps的Python代碼,只是為了重復一個代碼塊的副作用。
如果不對生成的列表執行某些操作,則不應使用該語法。
另外,盡量保持簡短。如果列表理解跨越兩行以上,則最好將其拆分或重寫為普通的舊 for 循環。使用你最好的判斷:對于Python和英語一樣,沒有硬性規定來清晰地寫作。

TA貢獻1824條經驗 獲得超6個贊
據此,可以獲得性能。
import timeit
def squares(size):
result = []
for number in range(size):
result.append(number*number)
return result
def squares_comprehension(size):
return [number*number for number in range(size)]
print(timeit.timeit("squares(50)", "from __main__ import squares", number = 1_000_000))
print(timeit.timeit("squares_comprehension(50)", "from __main__ import squares_comprehension", number = 1_000_000))
5.4292075
4.1652729000000015
希望這有幫助。

TA貢獻1808條經驗 獲得超4個贊
我想補充一點,你總是可以使用生成器和迭代器。沒有主要的內存開銷,但除非最里面的操作成本相對較高,否則性能可能會受到影響。
from itertools import chain
sentence = "flat is better than nested"
words = sentence.split()
f_words = (w for w in words if w.startswith('f'))
f_chars = chain(*f_words)
good_chars = [c for c in f_chars if c in 'abco']
添加回答
舉報