2017-01-27 17 views
-1

私は以下のように処理しようとしているpythonで250KBの辞書リストを持っています。目的は辞書clean upにあり、最後には繰り返し可能な値を返します。だから、私はこのようなものがあります:pythonで辞書(リスト)処理を高速化する

def check_qs(dict_list_in): 
    try: 
     del_id=[] 
     for i in dict_list_in: 
      tmp=i["get_url"][0] 
      if i["from"][0]=="var0": 
       try: 
        URLValidator()(tmp) 
       except: 
        del_id.append(i["id"]) 
      elif i["from"][0]=="var1": 
       try: 
        URLValidator()(tmp.split("\"")[1]) 
       except: 
        del_id.append(i["id"]) 
      elif i["from"][0]=="var2": 
       try: 
        URLValidator()(tmp.split("\'")[1]) 
       except: 
        del_id.append(i["id"]) 
      else: 
       del_id.append(i["id"]) 
      gc.collect() 
     result = filter(lambda x: x['id'] not in del_id,dict_list_in) 
     return result 
    except: 
     return dict_list_in 

私は上記のやっている何を、いくつかの条件のTHSリスト内の各辞書をチェックして、このfails場合、私はidを取得し、それらの辞書の特定を削除するためにfilterを使用しますリストから。

現時点では、実行には時間がかかります。欠けている明らかな最適化があるかどうかは疑問でした。私は現時点では、上記のコードはあまりにも素朴だと思う。

+0

「qs」とは何ですか?私はあなたがそれを使用する前にあなたがそれを定義するのを見ることはありません –

+0

[なぜ "例外:"良いプログラミングの練習を渡す "を読む?](//stackoverflow.com/q/21553327);ブランケット 'except:'を使わないでください。特定の例外をキャッチ*のみ*。 –

+1

そうでない場合は、ここではストレートフォワードループがあります。これが遅い場合は、 'URLValidator()()'呼び出しであり、リスト処理ではありません。 **コンポーネントを個別に分離し、個別にパフォーマンスをテストするか、適切なプロファイラを使用してボトルネックを特定します。 –

答えて

0

私はいくつかの変更を加えました。検証インスタンスをループから外して、毎回初期化する必要はありません。毎回インスタンス化する必要がある場合は、try acceptブロックに移動してください。元のリストのアイテムを削除することから、必要な新しいリストにアイテムを追加することに変更し、フィルタの必要性を取り除いた。また、検証文をif文から削除して、else文にヒットした場合に検証を実行する必要がなくなりました。 if文のロジックを見て、それはあなたと同じです。あなたがdjangoを使用しているように見えますが、もしあなたがexceptexcept Exceptionに変更していなければ。

from django.core.exceptions import ValidationError 

def check_qs(dict_list_in): 
    new_dict_list = [] 
    validate = URLValidator() 

    for i in dict_list_in: 
     test_url = i["get_url"][0] 
     if i["from"][0] == "var0": 
      pass 
     elif i["from"][0] == "var1": 
      test_url = test_url.split("\"")[1] 
     elif i["from"][0] == "var2": 
      test_url = test_url.split("\'")[1] 
     else: 
      continue 

     try: 
      validate(test_url) 
     # If you aren't using django you can change this to 'Exception' 
     except ValidationError: 
      continue 
     new_dict_list.append(i) 

    return new_dict_list 
関連する問題