質問

の場合はご利用の発電機を表現場を起用すべきリストの理解にPython?

# Generator expression
(x*2 for x in range(256))

# List comprehension
[x*2 for x in range(256)]
役に立ちましたか?

解決

ジョーンズの答えは良いこのリストの理解がより良い行いたい場合に対して繰り返し処理を実行するか複数の倍)です。しかし、も注目すべきリストを使用する場合のリスト。例えば、次のコードは動作しません:

def gen():
    return (something for something in get_some_stuff())

print gen()[:2]     # generators don't support indexing or slicing
print [5,6] + gen() # generators can't be added to lists

基本的には、利用発電機の発現がやっているのは繰り返し処理します。したい場合は店舗よび使用は、生成された結果、そのあとのリストを理解したりしています。

て性能が最も共通の理由をお選びのアドバイスではないでお一;だプログラムでもゆっくりと、しなければいけないのですが、き、気チューニングコード.

他のヒント

繰り返し処理の ジェネレータ式 または リスト理解 しかできないものです。しかし、 リスト理解 を全体のリストのメモリの最初の ジェネレータ式 を作成し、項目でお使いいただける非常に大規模も無限大!) dnaの塩基配列を決定した。

用リストの理解が必要で繰り複数回、速度が重要です。利用発電機の表現の幅が大きいまたは無限です。

私たちにとって重要なポイントは、リストの内包を新しく作成します。の発生装置を作成し、listオブジェクト"、"フィルタのソース材料によってon-the-flyして消費するのですね。

たとえば、2TBログファイルを"hugefile.txt"、といったコンテンツと長さの線路で始まる単語エントリー.

いう点による文書リストを理解:

logfile = open("hugefile.txt","r")
entry_lines = [(line,len(line)) for line in logfile if line.startswith("ENTRY")]

このslurpsの全ファイルをプロセスの各ラインにマッチした行よりお配列になります。この配列がこのために2TBの内容です。このコミュニケーションも楽しみのRAMれていないことが考えられ実用になるお客様の目的.

くすることができます。発生装置に"フィルター"の内容です。データが実際に読み込まれたままで繰り返し処理の結果です。

logfile = open("hugefile.txt","r")
entry_lines = ((line,len(line)) for line in logfile if line.startswith("ENTRY"))

なシングルラインから読み込むファイルになった。こうした当社のフィルター結果のさらなる:

long_entries = ((line,length) for (line,length) in entry_lines if length > 80)

いたものを読み、きちんと指定した現在二発電機る法データとしての願いです。

可能にした弊社のフィルタラインを別のファイル:

outfile = open("filtered.txt","a")
for entry,length in long_entries:
    outfile.write(entry)

現在 私の入力ファイルです。として for ループを要請し続けてい追加のライン、 long_entries 発電機の需要回線からの entry_lines 発電機、帰りのみの者の長さより大きい80文字以内です。とがありますことをご了承くださ entry_lines 発電機の要求ラインフィルタとして記したものから logfile 反復子は、読み込みのファイルです。

その代わりに"を押して"データへの出力機能を完全に疎リストだけを出力機能を引"データのみが必要です。この例の場合においても、なかなかないと柔軟性があります。発電機とコミュニケーションを重ねなが一;のデータからのログファイルのまま使が直ちに廃棄してもらえるのではなく、前線です。一方で、いろんな問いをデータにまだ行っています。

の利益を発生させる装置としても使用メモリからないの全リストです。発電機の発現を適切に使用した場合のリストが仲介などの回答結果を集計し又は作成dict出します。

例えば:

sum(x*2 for x in xrange(256))

dict( ((k, some_func(k) for k in some_list_of_keys) )

のあるリストにない全く発生し、このように少しメモリが使用されます(すべきもの高速化)

だが、リストの理解が希望する最終製品をリストアップしました。んせmemeory用発電機の表現は、たいに生成されます。または使用できる任意のリスト機能のようにソートされた逆になります。

例えば:

reversed( [x*2 for x in xrange(256)] )

作成時に発電機から変更可能なオブジェクトの様なリストを意識した成に評価される状態の時に発電機においてではなく、時間の創造、発電機:

>>> mylist = ["a", "b", "c"]
>>> gen = (elem + "1" for elem in mylist)
>>> mylist.clear()
>>> for x in gen: print (x)
# nothing

がある場合のチャンスをご覧く変更又は変更可能なオブジェクト内にそのリスト)が必要な状態に創造し発電機を使用する必要があり、リスト内包ます。

私が使っているの Hadoop Mincemeatモジュール.と思いここにはある注意:

import mincemeat

def mapfn(k,v):
    for w in v:
        yield 'sum',w
        #yield 'count',1


def reducefn(k,v): 
    r1=sum(v)
    r2=len(v)
    print r2
    m=r1/r2
    std=0
    for i in range(r2):
       std+=pow(abs(v[i]-m),2)  
    res=pow((std/r2),0.5)
    return r1,r2,res

ここでは発電機が数のテキストファイルとして大きな15GB)用の簡単な数学者の数をHadoopの地図を低減します。また使用しないの降伏関数ではなくリストの理解、そしてはるかに長い時間の算出総額の平均は、スペースの複雑性).

Hadoopるようになってきて使用して多くのメリットをしています。

時に逃げることができる ティ 機能から itertools, を返します複数の反復子は、同じ発生させる装置は独立して使用できる。

どの利用について[(exp x国際熱核融合実験炉(iter)]をいいます。性能から発電機の理解とリスト方法

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top