파이썬 for문 속도가 왜 느려지나요?
글쓴이: ha3k1e / 작성시간: 수, 2018/03/07 - 2:58오후
안녕하세요. 코딩 초보자입니다..
파이썬으로 데이터를 처리하는 코드를 만들고 있는데,
데이터의 크기에 따라 시간이 달라지는 문제가 있어 혹시 이유를 아시는 분이 있으신가해서 올려봅니다!
for i in range(1,len(output.splitlines())): input_data = json.loads(output.splitlines()[0]) # 1st one is the metadata feat_data = json.loads(output.splitlines()[i]) feat_type = feat_data["feature_type"] input_data[feat_type] = feat_data input_data["@timestamp"] = datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ") input_data["discovered_time"]=discover_tm input_data["crawl_mode"]=crawl_mode
이게 문제의코드인데,
output.splitlines()의 크기가 5000개 까지는 2-3초면 for문이 끝이나는데,
10000이 넘어가면 1초에 데이터를 200개 가량을 처리합니다.
그래서 데이터가 100000개가 넘어가면 몇 시간동안 for문을 돌고 있습니다..
연산을 하는 것도 아닌데 어째서 이렇게 오랜 시간이 걸리는건가요?
Forums:
혹시 output.splitlines가 단순히
혹시 output.splitlines가 단순히 어딘가에 저장되어 있는 문자열 리스트를 반환하는 역할만 한다면
모르겠지만 그게 아니라 문자열을 라인으로 나누는 일을 한다면 느려지는 것이 당연합니다. 아마도 후자일 것 같은데 그러면 for 문을 돌면서 매번 output.splitlines를 호출할 필요가 없지요. 매번 같은 데이터에 대해서 같은 일을 할 필요가 없습니다. 반복문 바깥에서 한 번 호출해서 결과를 저장해놓고 쓰세요. 시간을 얻는 부분도 마찬가지입니다.
엄청난 연산을 하고 있는데요.
엄청난 연산을 하고 있는데요.
range 를 구하기 위해 십만 라인짜리 문자열을 열심히 쪼개어 십만 개의 데이터로 분리했는데,
다시 그 중 단지 첫번째 원소 하나만을 쓰려고 두번째 줄에서 다시 십만 라인짜리 문자열을 분리하고
세번째 줄에서 i 번째 원소 하나만을 쓰려고 다시 십만 라인짜리 문자열을 분리하고...
게다가 두번째 줄과 세번째 줄은 루프 안에 들어있으니 이걸 다시 십만 번 반복하고...
딱 한 번만 split 한 다음에 그걸 재사용하세요.
파이썬에 익숙하지 않아 문법에 맞는지는 모르겠지만:
좋은 하루 되세요!
헉 그렇네요
왜 저걸 생각못했지.. 감사합니다 ㅎㅎ
댓글 달기