2017-11-09 3 views
0

APIを使用してWebサイトからチケット番号をダウンロードし、作成した一意のチケットIDを1つのIDインスタンスのみを受け入れるようカウントします。リストから重複を削除するより速い方法

これは非常に遅いです...私はセットを使用しようとしましたが、それは悪化しています。私はitertoolsなどの他のツールについては言及していますが、私のような状況でどのように使用できるかについて明確な説明はありません。

良い変数と悪い変数は、私が知ることのできるジェネレータのタイプを格納します。あなたの助けをありがとう! listとしてgood_array

good = self._client.satisfaction_ratings(score="good",sort_order="asc",start_time=thirty_days,end_time=today) 
    bad = self._client.satisfaction_ratings(score="bad", sort_order="asc", start_time=thirty_days, end_time=today) 
    good_array = [] 
    bad_array = [] 
    for g in good: 
     if g.ticket.id not in good_array: 
      good_array.append(g.ticket.id) 
    for b in bad: 
     if b.ticket.id not in bad_array: 
      bad_array.append(b.ticket.id) 
    goodnum = len(good_array) 
    badnum = len(bad_array) 
+1

設定してみましたか? 'good_array = {g.ticket.id for g良い}'。それは遅くすることはできません。 –

+0

それは重複を排除するために働くだろうか?これにif文を追加しますか?{g.ticket.idはgの中にいないといいですか?}値がすでに存在するかどうかを確認するためにリストをチェックしなければならないという事実は、私が思うスピード。 – Shezmula

+1

はい、セットは複製、更新された回答を排除します。 –

答えて

3

if g.ticket.id not in good_arrayは、それ以降のすべての権利は、線形検索を使用して低速である(と私は順序は重要ではありません理解)setを使用して

だけのユニークな要素を維持するのに最適な方法である(と

が遅くなることはないことを、あなたは

今、ちょうどループを削除し、2セットの内包表記を作成する)間違った方法でそれらを使用している必要がありますあなたが行ったように

good_array = {g.ticket.id for g in good} 
bad_array = {g.ticket.id for g in bad} 

その後、カウント:

goodnum = len(good_array) 
badnum = len(bad_array) 
+0

時間差は依然としてごくわずかですが、数秒で速くなりました。平均59秒ではなく55秒になるかもしれません。これは私がセットをよりよく理解するのを助けました。より大きなデータに – Shezmula

+0

を設定すると、時間差が顕著になります。 –

-1

セットは、重複を許可しないのpythonのデータ型です。 は、単にあなたの良いと悪いリストを設定するにはキャスト -

unique_good = set(good) 
unique_bad = set(bad) 

あなたはあなたがリストのためになったのと同じ方法でセットの長さを得ることができます。

+2

ここでは、 'g.ticket.id'のように、idではなく' good'と 'bad'の項目からセットを作成するので、これは同等ではありません。それで、すでに存在する答えに見られるように、リストの理解が必要なのです。また、設定するためにキャストしていない場合は、 'set()'関数を使って新しいセットを作成しています。 –

関連する問題