どんなフィルターの効率的な計算値をPythonリスト内包?
-
02-07-2019 - |
質問
Pythonのリスト内包書式でフィルターの値以内に理解したりしています。例えば:
result = [x**2 for x in mylist if type(x) is int]
までの一覧を返します正方形の整数でmylist.しかし、どのような場合この試験は一部の(コ)の計算び出すためのものではありませんフィルターをどのような特徴がありますか?一つのオプション:
result = [expensive(x) for x in mylist if expensive(x)]
このリスト"false"高(x)の値が高()が呼び出される二回毎にx.が解説ることを可能にすることに試験をを呼び出すだけで高価なっx?
解決
場合に計算してく束ね機能の使用に関してはどう filter
や map
?
result = filter (None, map (expensive, mylist))
利用できる itertools.imap
場合のリストが非常に大きかった。
他のヒント
って自分の答えの後に分かった。で入れ子の理解:
result = [y for y in (expensive(x) for x in mylist) if y]
いのではないでしょうか作品のものを見たいの入れ子の理解がより僅かに読み取
目の前にある、ことりと触れ合(といあうことで最も読可能)答えは、使用しないでリストの理解や発電機を表現ではなく、実発電機:
def gen_expensive(mylist):
for item in mylist:
result = expensive(item)
if result:
yield result
で横スペースも見やすくでおすすめです終わせを繰り返します。
result = [x for x in map(expensive,mylist) if x]
地図()はリストを返しの値のオブジェクトmylist渡高().それが覧いただけます-把握し、不要な数値です。
このようなもので、主には入れ子内包するときは早くからpythonインタプリタを最適化できるのでかなりやすい)。
のは、まさにこのような発電機に適したハンドル:
result = (expensive(x) for x in mylist)
result = (do_something(x) for x in result if some_condition(x))
...
result = [x for x in result if x] # finally, a list
- これは完全に明確に何が起きている中での各段階パイプライン
- 明示的な暗黙の間
- 利用発電機までの随所に最後の一歩になるかもしれないので大きな中間リスト
きも memoize の expensive()
機能そのものは単なるルックアップのための計算値 x
.
きmemoize高(x)(ばれたが、呼び出し高(x)の頻度で、ほとんどの場合はmemoizeで作動します。このページの実装memoize python:
http://code.activestate.com/recipes/52201/
この追加の利益が高(x)が実行される 以 何回からず重複した複数のメモを前ます。
この想定価(x)は真の機能に依存しない外部の状態変更の可能性があります。が高い(xは外部の状態を検出できた時の状態変更いたしますので 隠 変更中のリストを理解したときにリセットのメモの前に理解したりしています。
私の指定:
itertools.ifilter(bool, (expensive(x) for x in mylist))
されるメリットがあります:
- 避けなしとしての機能解Python3): http://bugs.python.org/issue2186
- 使用反復子.
あの旧のご利用 for
ループに追加リストがありま
result = []
for x in mylist:
expense = expensive(x)
if expense:
result.append(expense)