Data Navigator

파이썬 코드 효율적으로 짜기 - 20시간을 2초로 바꾼 몇 줄의 코드 수정 본문

Python

파이썬 코드 효율적으로 짜기 - 20시간을 2초로 바꾼 몇 줄의 코드 수정

코딩하고분석하는돌스 2021. 1. 13. 07:04
for korean in df['description']:
    if isHangul(korean[0]) == True:    
        isKor = df.loc[df['description'] == korean]
        KoreanReviews = pd.concat([KoreanReviews,isKor])
    else:
        notKor = df.loc[df['description'] == korean]
        ForeignReviews = pd.concat([ForeignReviews,notKor])


print('일치: ',len(KoreanReviews['description'].value_counts()),
      '불일치: ', len(ForeignReviews['description'].value_counts()))

247,519개의 자료를 한글과 외국어로 분류하는 코드를 작성했다.

 

컬럼에서 자료를 읽어와서 한글인지 확인하는 함수로 체크한 후 한글이면 KoreanReviews 아니면  ForeignReviews 라는 이름의 데이터 프레임에 자료를 아래로 추가하는 형식으로 코드를 만들었다.

 

코드 실행 후 메모리 사용량이 급증하면서 약 20시간 이상 계속해서 실행이 되었는데...

너무 오래 걸려서 중단시켜 보니 한글로 분류된 데이터는 고작 1259개만 처리가 되어 있었다.

 

코드를 다시 살펴보니..

 

for korean in df['description']:
    if isHangul(korean[0]) == True:    
        isKor = df.loc[df['description'] == korean]
        KoreanReviews = pd.concat([KoreanReviews,isKor])
    else:
        notKor = df.loc[df['description'] == korean]
        ForeignReviews = pd.concat([ForeignReviews,notKor])


print('일치: ',len(KoreanReviews['description'].value_counts()),
      '불일치: ', len(ForeignReviews['description'].value_counts()))

이 코드는 데이터프레임의 댓글 1행을 뽑아 그 1줄이 한글인지 확인하고 맞으면 다시 그 행이 있는 곳을 찾아서 모든 컬럼을 가져와 새 데이터프레임에 추가하는 형식이다.

 

즉... 1개를 한글인지 검사한 후 24만개를 비교해서 값을 찾아 맞으면 새 데이터 프레임에 합치는 방식...

24만개의 데이터를 약 24만번 다시 탐색해야 하는 코드이다.. 오래 걸리는 것이 당연....;;;;

 

그래서 이번에는 한글이 맞으면 True 아니면 False를 리스트에 넣어서 데이터 프레임에 합친 후 그 True False값만으로 데이터프레임을 불러와 다른 데이터프레임에 저장하는 방식으로 해 보았다.

 

# 한글인지 아닌지 검사해서 isKorNot 리스트에 True/False를 추가하고 df에 isKorNot 컬럼을 만들어 추가

isKorNot = []
for korean in tqdm(df['description']):
    if isHangul(korean[0]) == True:    
        isKor = True
        isKorNot.append(isKor)
    else:
        notKor = False
        isKorNot.append(notKor)

df['isKorNot'] = isKorNot

 

헐... 불과 몇 초만에 끝.....

 

추가한 isKorNot 컬럼을 True/False 조건으로 각각 추출해서 새로운 데이터 프레임을 만드는데는 1초도 걸리지 않았다..

 

코드를 효율적을 짜는 것이 얼마나 중요한지 몸소 경험한 시간...

 

20시간 넘게 시스템 자원을 다 써가며 돌아도 고작 1259개 처리 되었는데.. 코드를 몇 줄 바꾼 것 만으로 몇 초만에 끝났다. 앞으로는 반복문을 돌릴때 조금 더 생각을 해서 코드를 작성해야 겠다...

 

아까운 내 시간과, 컴퓨터 수명 연장, 정신 건강을 위해서....