2014-11-13 2 views
3

나는 루프에 상응하는 것보다 더 성능이 좋기를 희망하는리스트를 가지고있다. 그러나, 나는 python이 어떻게 comprehensions을 평가하는지 확신 할 수 없다. 폭이 먼저 넓다면 연산은 비싸지 만, 각 단계에서 모든 것을 평가하는 것이 가능할뿐입니다. 한 번 평가 된 데이터 만 루프를 통과해야합니다. 내가 궁금해하는 목록의 이해는 아래에있다.파이썬리스트 comprehensions의 평가

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

어떻게 평가 되나요? 해시를 계산 한 다음 외부 루프로 버블 링하거나 모든 해시를 먼저 계산합니까?

+0

나는 당신이 할 수 있다고 생각 ['발전기 expressions'] (https://docs.python.org/2/reference/expressions.html#generator-expressions) , 내부 목록 comprehensions의 대괄호를 괄호로 대체하면이 방법으로 한 번에 하나씩 당신이가는 내부 표현을 평가할 수 있습니다. –

+0

그래, 그게 내가 지금하고있는 일이지만, 파이썬 이해력이 어떻게 평가되는지 알고 싶다. – ragingSloth

답변

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!']