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']
添加回答
举报