파이썬에서 sort된 리스트에서 특정조건 처음 시작되는 위치 찾는법

조회수 1327회

list1=[1,4,6,8,11,13,16] 처럼 sort된 list가 주어졌을때 9이상으로만 구성된 list1의 sublist를 구하는 방법을 알고 싶습니다.

2가지 방법을 생각하고 있습니다.

첫째, list1=filter(lambda x: x>=9, list1)

둘째,list1.append(9) list1.sort() idx=list1.index(9) list1=list1[idx+1]:

셋째, binary search

제가 불만족스러운 것은, 1과 2의 방법은 리스트가 이미 sort되있다는 점을 활용하지 못해 시간을 비효율적으로 사용한다는 것입니다. 모든 원소를 다 스캔할 필요가 없는데, 결국 다 스캔하는 문제가 있습니다.

3의 방법은 코드가 길어지게 됩니다.

뭔가 쉽고 효율적으로 찾는 방법이 있을 것 같습니다! O(n) 표기법으로는 logn이 최대겠지만, 이런 형식상의 문제는 제쳐두고 실제로 시간만 아끼면 됩니다. 내장함수를 잘 활용하면 방법이 있을 것 같습니다.

알려주시면 정말 감사하겠습니다

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    시간만 아낀다. 즉 성능의 이슈라면 c로 확장모듈을 사용하는 것이 가장 낫습니다

    또한 파이썬의 내장함수들은 범용적이어서 사용하기는 편리하지만 효율성만 따지면 좋지 않을 수 있습니다. 차라리 함수를 만들어 사용하는게 성능상의 잇점이 좋은 경우가 많습니다.

    def getListIndexByValue(L, value):
        for i, v in enumerate(L):
            if v > value:
                return i
    
    list1=[1,4,6,8,11,13,16]
    list1[getListIndexByValue(list1, 9):]
    [11, 13, 16]
    

    cython python 성능비교

    #cython 펑션(-O3)
    def getListIndexByValue_C(list L, int value):
        cdef int i, v
        for i, v in enumerate(L):
            if v > value:
                return i
    
    #python
    def getListIndexByValue(L, value):
        for i, v in enumerate(L):
            if v > value:
                return i
    
    timeit -n10000 getListIndexByValue_C(list1, 9)
    10000 loops, best of 3: 61.9 ns per loop
    
    timeit -n10000 getListIndexByValue(list1, 9)
    10000 loops, best of 3: 554 ns per loop
    

    cython으로 타입만 지정해주었을 뿐인데도 대략 9배 정도 성능 차이가 납니다.

    파이썬은 태초부터 성능을 위한 언어가 아니라 생산성에 방점을 찍고 있음을 인지하고 사용했으면 합니다. 즉 파이썬에서 성능을 개선하는 것 보단 파이쏘닉한 코드를 유지하되 병목구간은 c로 작성하는 편이 낫습니다.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)