私はスピード部門で苦しんでいるアプリケーションを微調整しようとしています。そのため、私はすべてのfor-loop文を可能な限りリスト内包に変換し始めました。Django QuerySetsを使っているときにforループの代わりにリスト内包を使用する
現在、私はDjangoクエリーセットの辞書を反復処理する必要がある関数に取り組んでいます。古いコードはfor-loopステートメントを使ってこれを反復処理し、正常に動作します。リストの理解を使用する私のコードは、私のモデルオブジェクトの代わりにdjango querysetsを返します。
def get_children(parent):
# The following works
children = []
for value in get_data_map(parent).itervalues():
children += list(value)
# This part doesn't work as intended.
booms = [value for value in get_data_map(parent).itervalues() if value]
import pdb
pdb.set_trace()
(Pdb) type(children[0])
<class 'site.myapp.models.Children'>
(Pdb) type(booms[0])
<class 'django.db.models.query.QuerySet'>
注get_data_mapする値<class 'django.db.models.query.QuerySet'>
あるコードのこの部分は、アプリケーションの中で最も時間のかかる部分の一つである辞書を返すこと:ここで
コードがあります。これをリスト内包表記で処理すると、アプリケーションの速度はうまくいけば2倍速くなります。
コードのこの部分をどのように高速化できますか?
あなたは、リスト内包が通常の 'for ... in ...'ループより速いと思いますか? – dcrosta
私はジェネレータ、リスト内包表記、forループ、mapについて簡単なテストを行いました。リスト内包表記は.. forループよりも2倍ほど高速でした。 – mohi666