ここは私の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
ここは私の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
よりもむしろ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関数の呼び出しは、演算子の実行に比べて比較的遅いです。
'.append'はループのたびに再評価される関数参照です。バイトコードは良い考えですが、ループの前に 'append = website_title.append'を追加する方が簡単です。ループの中の' append(g .extract(url).title) 'によって' website_title.append extract(url).title) 'を実行します。これはループで毎回再評価されないので、はるかに高速です。これは[公式のPythonのパフォーマンスのヒント](https://wiki.python.org/moin/PythonSpeed/PerformanceTips)から取得されました。 –
@DavidG。確かに、ローカルで '.append'メソッドをキャッシュすることは、各ループの繰り返しでルックアップを実行するよりも確かに高速です。しかし、それはまだリストの理解を使用するほど速くはありません。前回私がこれをテストしたとき、キャッシュされたappendのバージョンは、リストのcompとキャッシュされていないバージョンの間の速度のほぼ中間でしたが、実際の速度はPythonのバージョンによって異なります。 –
範囲()、は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)
前述の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)
:ここでは例の抜粋です。私はそれがどのように役立つかわかりません。これを避けると、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
私は 'g.extract'は実際に時間がかかっていると思いますか?それは何をするためのものか...? – deceze
urltは一意ですか? – giaosudau
それぞれの反復は独立しているようですので、マルチプロセッシングを使用してみてください – galaxyan