2014-02-24 2 views
2

분명히하기 때문에 all(map(func, iterables))을 사용하고 싶습니다. 그러나이 접근법이 최적화되어 있는지 여부에 관심이 많습니다. 예를 들어, map()의 계산 결과가 True이 아닌 경우 매핑을 중지해야합니다. 내 프로젝트에서파이썬에서 모두 (map (...)) 최적화가 있습니까?

예 : 나는 기능 같은 스타일을 선호

for item in candidate_menu: 
    if not item.is_max_meals_amount_ok(daily_menus): 
     return False 
return True 

:

all(map(operator.methodcaller('is_max_meals_amount_ok', daily_menus), candidate_menu) 

을 나는이 파이썬에서 all(map(...)) 또는 any(map(...))에 대한 최적화?

편집 : Python 2.7이 탑재되어 있습니다. 파이썬 2.x에서의 게으른 평가를 얻고 싶다면

+1

표준 라이브러리에서'any'와'all' 둘 다 lazy입니다. – jonrsharpe

+1

'map()'은 Python 3에서 게으르다. – jfs

답변

5

작동합니다 발전기로,

그렇게 할지도() 명령을 통해 변경지도를 전파되지 것입니다 itertools.imap - all(imap(func, iterable))을 사용할 수도 있습니다. map과 비교하면 imap은 반복자이므로 all이 소비를 중단하면 더 이상 진행되지 않습니다.

+0

내가 필요하다. 고맙습니다! –

4

, 시도 :

all(func(i) for i in iterables) 

이 전체 목록을 작성하지 않습니다 다음 map 달리 평가한다. Python 3.x에서 map은 반복자를 반환하므로 기본적으로 게으르다.

1

편집 :지도가 생성기 인 Python 3의 경우이 대답은 True가 아닙니다!

번호 allany는 단락하지만 map이되지 않습니다 : 그것은이 단락을 수행하는 코드의 비트에서 호출 된 것을 알고, 항상 단지 전체 목록을 반환 할 수 없습니다.

용액 발전기 식을 사용한다 :

단락하지
all(func(i) for i in iterables) 

.

1

"all/any"는 단락 회로를 사용합니다.

하지만

all(func(x) for x in iterable) 

all(func(i) for i in iterable)에 또한 다른 사람에 의해 제안

관련 문제