파이썬 for문 속도가 왜 느려지나요?

ha3k1e의 이미지

안녕하세요. 코딩 초보자입니다..

파이썬으로 데이터를 처리하는 코드를 만들고 있는데,

데이터의 크기에 따라 시간이 달라지는 문제가 있어 혹시 이유를 아시는 분이 있으신가해서 올려봅니다!

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문을 돌고 있습니다..

연산을 하는 것도 아닌데 어째서 이렇게 오랜 시간이 걸리는건가요?

익명 사용자의 이미지

혹시 output.splitlines가 단순히 어딘가에 저장되어 있는 문자열 리스트를 반환하는 역할만 한다면
모르겠지만 그게 아니라 문자열을 라인으로 나누는 일을 한다면 느려지는 것이 당연합니다. 아마도 후자일 것 같은데 그러면 for 문을 돌면서 매번 output.splitlines를 호출할 필요가 없지요. 매번 같은 데이터에 대해서 같은 일을 할 필요가 없습니다. 반복문 바깥에서 한 번 호출해서 결과를 저장해놓고 쓰세요. 시간을 얻는 부분도 마찬가지입니다.

raymundo의 이미지

엄청난 연산을 하고 있는데요.

range 를 구하기 위해 십만 라인짜리 문자열을 열심히 쪼개어 십만 개의 데이터로 분리했는데,
다시 그 중 단지 첫번째 원소 하나만을 쓰려고 두번째 줄에서 다시 십만 라인짜리 문자열을 분리하고
세번째 줄에서 i 번째 원소 하나만을 쓰려고 다시 십만 라인짜리 문자열을 분리하고...
게다가 두번째 줄과 세번째 줄은 루프 안에 들어있으니 이걸 다시 십만 번 반복하고...

딱 한 번만 split 한 다음에 그걸 재사용하세요.
파이썬에 익숙하지 않아 문법에 맞는지는 모르겠지만:

lines = output.splitlines()
for i in range(1, len(lines)):
    input_data = json.loads( lines[0] ) # 1st one is the metadata
    feat_data = json.loads( lines[i] )

좋은 하루 되세요!

ha3k1e의 이미지

왜 저걸 생각못했지.. 감사합니다 ㅎㅎ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.