2016-06-24 6 views
-1

ここは私のforループです。 100,000回を超える実行には非常に時間がかかります。forループを速く走らせるには?

for urlt in xrange(0, len(clean_url_data)): 
    website_title.append(urlt) 
    website_title[urlt]=g.extract(clean_url_data[urlt]).title 
    print urlt 
+2

私は 'g.extract'は実際に時間がかかっていると思いますか?それは何をするためのものか...? – deceze

+0

urltは一意ですか? – giaosudau

+1

それぞれの反復は独立しているようですので、マルチプロセッシングを使用してみてください – galaxyan

答えて

1

よりもむしろwebsite_title.append(urlt)を使用してwebsite_titleリストを拡張して、すぐにタイトルデータとurlt項目は、あなただけのリストに直接タイトルデータを追加する必要があることを上書きします。

また、clean_url_dataのインデックスに整数ループを使用するのではなく、clean_url_dataリストを直接反復する方がよいでしょう。インデックスが必要な場合はenumerateを使用できます。

website_title = [] 
for i, url in enumerate(clean_url_data): 
    website_title.append(g.extract(url).title) 
    print i 

もしあなたが本当にそのインデックスを必要としないならば、もっと簡単にすることができます。ここでは、ループでappendを使うよりも少し速い、リストの理解を使ったアプローチがあります。

website_title = [g.extract(url).title for url in clean_url_data] 

リストの内包は、基本的に事業者である特別なLIST_APPENDバイトコードを、使用していますので、そのリストの.append方法を探して、それを呼び出すよりも高速です。 Python関数の呼び出しは、演算子の実行に比べて比較的遅いです。

+0

'.append'はループのたびに再評価される関数参照です。バイトコードは良い考えですが、ループの前に 'append = website_title.append'を追加する方が簡単です。ループの中の' append(g .extract(url).title) 'によって' website_title.append extract(url).title) 'を実行します。これはループで毎回再評価されないので、はるかに高速です。これは[公式のPythonのパフォーマンスのヒント](https://wiki.python.org/moin/PythonSpeed/PerformanceTips)から取得されました。 –

+0

@DavidG。確かに、ローカルで '.append'メソッドをキャッシュすることは、各ループの繰り返しでルックアップを実行するよりも確かに高速です。しかし、それはまだリストの理解を使用するほど速くはありません。前回私がこれをテストしたとき、キャッシュされたappendのバージョンは、リストのcompとキャッシュされていないバージョンの間の速度のほぼ中間でしたが、実際の速度はPythonのバージョンによって異なります。 –

0

範囲()はxrange()マップ()を比較してみてください。 g.extractは時間がかかることがあります。

def set_website_title(urlt): 
    if urlt not in website_title: 
     website_title.append(urlt) 
     website_title[urlt] = g.extract(clean_url_data[urlt]).title 
     print urlt 

if __name__ == "__main__": 
    map(set_website_title, clean_url_data) 
0

前述のgalaxyanと同様に、マルチプロセッシングを使用することができます。あなたはwebsite_titleを一覧表示するには、数値項目を追加され、その後、あなたは、リスト内の同じ項目の値を上書き

def clean(url): 
    return {'url': url, 'title': g.extract(url).title} 

from multiprocessing import Pool 
pool = Pool() 
website_info = pool.map(clean, clean_url_data) 
0

:ここでは例の抜粋です。私はそれがどのように役立つかわかりません。これを避けると、forループは少し速くなります。

この試験が示すように:

# Your version, with append() and assignment 
%%timeit 
l = [] 
for n in xrange(100000): 
    l.append(n) 
    l[n] = 'something' 

10のループを、3の最もよい:ループあたり22.4ミリ

# Without reassignment 
%%timeit 
l = [] 
for n in xrange(100000): 
    l.append('something') 

100ループ、3の最もよい:ループ

当たり 16.6ミリ
# even better with list comprehension 
%%timeit 
l = ['something' for n in xrange(100000)] 

ループ100個、最高3:ループあたり7.86ms

関連する問題