评估python列表理解

时间:2014-11-13 20:08:51

标签: python optimization list-comprehension

我有一个列表理解,我希望它比循环等效更高效。但是,我不确定python如何评估理解。如果它首先评估广度,那么操作是昂贵的,但是,在每一步评估它们似乎是可行的,只需要对数据进行一次评估并通过循环向上传递。我想知道的列表理解是在下面。

[(Counter(x.keys()), x) for x in [Counter([hashxx(w)%100000 for w in n.split()]) for n in x]]

如何评估?是否会计算散列,然后冒泡到外循环或者首先计算所有散列?

1 个答案:

答案 0 :(得分:4)

列表推导始终在其发生的位置进行全面评估,就像a+b之类的任何其他表达式一样。列表理解不知道"知道"这是在另一个列表理解中,所以它在此基础上表现不同。

如果你想逐步迭代"一次只能从列表推导中生成一个项目,那么请使用generator expression

这是一个简单的比较:

def inner(x):
    print("inner")
    return x.upper()

def outer(x):
    print("outer")
    return x+"!"

# inner comprehension is a list comprehension
>>> [outer(x) for x in [inner(x) for x in ('a', 'b', 'c')]]
inner
inner
inner
outer
outer
outer
['A!', 'B!', 'C!']

# inner comprehension is a generator comprehension
>>> [outer(x) for x in (inner(x) for x in ('a', 'b', 'c'))]
inner
outer
inner
outer
inner
outer
['A!', 'B!', 'C!']