在列表理解中赋予函数列表的效率

时间:2015-08-06 20:18:19

标签: python list-comprehension

当你在像这样的列表理解中提供一个旧列表的功能时

my_new_list = [x * 2 for x in list_maker()]
每次抓取新的list_maker()时,

会被x调用吗?

我想知道,因为我想知道这样做是否更有效

my_old_list = list_maker()
my_new_list = [x * 2 for x in my_old_list]

谢谢!

1 个答案:

答案 0 :(得分:4)

答案,就像大多数问题"哪个更有效?","它取决于"。

传统上,list_maker将被调用一次,因此无论是在列表推理中还是在外部调用它并分配给变量都没有区别(1)。

然而(这就是@PeterWood所指的),list_maker可能是generator,这会导致它重复输入(这不完全是与重复调用相同,但可能足够接近)。 (另见PEP 255。)

然而,哪个更有效的问题并不明确 - 返回整个列表的常规函数​​将使用比生成器更多的内存,这可能会或可能不会更昂贵。

(1)除了用于存储list_maker结果的内存可以在列表compreshension竞争后立即释放,my_new_list必须首先超出范围未引用的范围。< / p>