Rad Blog

Archive

FFT in Python_비교연산을 수행할 때 하나라도라는 크거나 작은 값을 요구하는 조건이라면 any를 쓰자

Foot For Thought : 생각할 거리, -를 줄여서 FFT-

 생각해볼 거리를 정리해서 글로 올리자는 취지로 카테고리를 ‘Food For Thought’라고 설정했다.ㅎㅎ
 ‘Food For Thought’는 최근에 알게된 영어 표현으로 생각해볼 거리를 은유적으로 사용하는 범용적인 말이라고 한다.
 사실 블로그에 글을 올려야겠다 생각하면서도 지나고 나면 까먹기 때문에 이번만큼은 즉각 올리기로 마음먹고 글을 쓰는 중이다.

 각설하고, 본론으로 들어가자면 Python으로 코딩 테스트 연습 문제를 풀던 중에, “원소 중 하나라도 크거나 작은 것이 있다면"이라는 조건이 붙었을때 어떻게 하면 좋을지 생각해봤다.
 하나의 예시를 들자면 풀고 있었던 문제에서는 2차원 배열에서 특정 열에 위치한 원소를 지정된 값과 비교하여 대소관계를 가리는 형태로 풀어나가야 했었다.

여러 시도를 해보기 전에는 그냥 막연하게

target : < max(array, key=lambda value: value[1], value[0])

(와)과 같은 형태로 하면 되겠거니 하고 있었는데,
  all()과 any()를 사용해보니 비교 횟수가 너무도 다르다는 것을 확실하게 알 수 있었다.
 하나라도 큰 값이 있을 때는 특정한 연산을 수행한다. 그러므로 하나라도 큰 값이 있는지를 구하기 위해 수행해야 하는 연산을 비교해 보았다.

 내가 시도했었던 max()의 경우 해당 배열 내의 모든 원소들을 순회하여 가장 큰 값을 찾고, 비교연산을 1번 수행하기 때문에 N+1번의 비교를 한다.

 하지만 디버깅으로 확인해 본 결과 any()의 경우에는 하나라도 조건을 만족하지 않는다면 바로 False를 반환, 동작 수행을 종료하고 다음 수행할 작업으로 넘어가는것이 확인이 가능했다. 따라서 시간적으로 상당한 비용 절약이 가능한 것을 알 수 있었다.

  all()의 경우도 마찬가지로 모든 조건이 참을 만족하는가 확인하는 작업을 수행하다가 하나라도 만족하지 않는다면 Flase를 반환하고 다음 수행할 작업으로 넘어갔다.
 그러니 효과적인 작업을 위해서 Python에서 비교연산을 수행할 때 하나라도라는 크거나 작은 값을 요구하는 조건이라면 any()를 쓰자.

물론 요구사항이 조금이라도 다른 내용이라면 그것에 맞게 더 적합한 기능을 사용하는것이 알맞겠지만 하나라도 크거나 작은 값을 가리도록 하는 문제나 상황이 자주 발생할 것을 대비해 상황발생후 즉시 남겨놓았다.

아래는 내가 풀었던 코딩테스트 연습 문제인데 이다음에 다시 이 글을 볼때 보다 잘 이해하고 습득하기 위해서 덧붙여 놓으려고 한다. 이건 해당 문제의 요구사항이다.

  1. 인쇄 대기목록의 가장 앞에 있는 문서(J)를 대기목록에서 꺼냅니다.
  2. 나머지 인쇄 대기목록에서 J보다 중요도가 높은 문서가 한 개라도 존재하면 J를 대기목록의 가장 마지막에 넣습니다.
    -> 여기서 중요도가 높다는 것은 더 큰 숫자를 의미하는 것이었다.
  3. 그렇지 않으면 J를 인쇄합니다.
    -> 리스트를 큐와 같은 형태로 사용하는 문제이다.

위에서 적은 내용에 입각한다면 문제의 요구사항의 2번 부분에서 아래와 같이

if any(J[1] < x[1] for x in data_queue):

이런 형태의 코드를 쓰면 좋겠다.
원래 내가 사용했던 코드는 아래와 같다.

if J[1] < max(data_queue, lambda value: (value[1]))[1]:

any()와 all()이 생각보다 예상치 못한곳에서 쓰이는 것을 더러 봤다. 앞으로 그런 센스를 더 키울 수 있도록 특정 상황마다 자주 써보고 쓰여진 예시들을 참고해보거나 해야겠다. :)

comments powered by Disqus