場合にあてはまるわけではない時間の使用にpythonの発電機?
-
05-07-2019 - |
質問
これはかなりの逆の 何ができるのご利用のPython発生装置の機能。:python発電機、発電機を表現し、 itertools
モジュールの一部は私が好きな特徴のpythonです。うに特に設定時に、チェーンの業務遂行上の大きな杭のデータをよく利用して加工した場合DSVファイルです。
がで ない 良き時間を利用発電機又は発電機の発現や itertools
機能しているのでしょうか。
- しいただいてもかまいません。
zip()
以上itertools.izip()
, や range()
以上xrange()
, や[x for x in foo]
以上(x for x in foo)
?
明らかにし、最終的に必要な"解決"発電機への実際のデータは、通常、リストの作成または繰り返し処理を行い、非発生ループを実行します。もしかを知る必要がある。こいいと思います。
また利用発電機のような配新たなリストをメモリにロード中間データです。これらは特に意味をな大規模データセット正にあなために小さなデータセットもあるのですか?あなメモリ/cpuの貿易-。
私が特に興味があれば誰でもが一部のプロファイリングはこの目論 リスト理解の性能比地図()およびフィルター). (altのリンク)
解決
リストではなく、発電機の場合:
1)アクセスに必要なデータ 複数の 時間(すなわちキャッシュの結果ではなくrecomputing):
for i in outer: # used once, okay to be a generator or return a list
for j in inner: # used multiple times, reusing a list is better
...
2)必要なもの ランダムアクセス (又はそのアクセス以外進順次):
for i in reversed(data): ... # generators aren't reversible
s[i], s[j] = s[j], s[i] # generators aren't indexable
3)必要なもの 加 文字列(必要とする二つの上を通過すると、データ):
s = ''.join(data) # lists are faster than generators in this use case
4)ご利用の PyPy るものがない最適な発電機コードなどで通常の関数呼び出し、リストの操作.
他のヒント
一般的な利用発電機要な時に必要なリスト操作のように、len()、逆()です。
が発生する可能性があり回したくない場合に怠け者の評価などいすべての計算フロントで解除することができ材).その場合は、一覧表現の方が良いかもしれない。
プロファイル、プロファイル、ます。
プロファイリングコードを知れば何をやっているはず。
多用途のxrange、発電機などは静的サイズの小さいデータセットまだまだ大規模なデータセットで感します。range()に対xrange()がうかがわせるものとなっているのコードのみの小さなアルガルベカップではこれまで醜い、なんか気のい。
プロファイル、プロファイル、ます。
ということで、"これらは特に意味をな大規模データセット"と思いこの回答のご質問です。
の場合は打ち切壁、性能的にできるものにこだわりリストおよび標準機能そのままと問題性能のスイッチです。
てる@u0b34a0f6aeのコメントを使用した場合は、発電機の開始につくることができますが使いやすくするために、規模が大きくなデータセット
に関する性能:を使用する場合はpsyco、リストでも高速しています。以下の例では、リストのほとんどが50%高速化利用の場合psyco.フル()
import psyco
import time
import cStringIO
def time_func(func):
"""The amount of time it requires func to run"""
start = time.clock()
func()
return time.clock() - start
def fizzbuzz(num):
"""That algorithm we all know and love"""
if not num % 3 and not num % 5:
return "%d fizz buzz" % num
elif not num % 3:
return "%d fizz" % num
elif not num % 5:
return "%d buzz" % num
return None
def with_list(num):
"""Try getting fizzbuzz with a list comprehension and range"""
out = cStringIO.StringIO()
for fibby in [fizzbuzz(x) for x in range(1, num) if fizzbuzz(x)]:
print >> out, fibby
return out.getvalue()
def with_genx(num):
"""Try getting fizzbuzz with generator expression and xrange"""
out = cStringIO.StringIO()
for fibby in (fizzbuzz(x) for x in xrange(1, num) if fizzbuzz(x)):
print >> out, fibby
return out.getvalue()
def main():
"""
Test speed of generator expressions versus list comprehensions,
with and without psyco.
"""
#our variables
nums = [10000, 100000]
funcs = [with_list, with_genx]
# try without psyco 1st
print "without psyco"
for num in nums:
print " number:", num
for func in funcs:
print func.__name__, time_func(lambda : func(num)), "seconds"
print
# now with psyco
print "with psyco"
psyco.full()
for num in nums:
print " number:", num
for func in funcs:
print func.__name__, time_func(lambda : func(num)), "seconds"
print
if __name__ == "__main__":
main()
結果:
without psyco
number: 10000
with_list 0.0519102208309 seconds
with_genx 0.0535933367509 seconds
number: 100000
with_list 0.542204280744 seconds
with_genx 0.557837353115 seconds
with psyco
number: 10000
with_list 0.0286369007033 seconds
with_genx 0.0513424889137 seconds
number: 100000
with_list 0.335414877839 seconds
with_genx 0.580363490491 seconds
どの性能の関係者が思いつかないのを使いたいリストを超え機能します。
ことがなかった状態で発電機の遂行上支障が何をしようとしています。が、しかし、たっぷりのインスタンスが利用発電機のないとき以上になれます。
例えば:
sorted(xrange(5))
をご利用いただけません改善:
sorted(range(5))
す。リストの理解が必要な場合の値の周りのために何かをお客様のサイズが大きすぎます。
例えば:を作成するリストでループを複数回、その後にプログラム。
ある程度のようなものと考えることができる発電機の代替として、繰り返し処理(ループ)vs.リスト理解としてのタイプのデータ構造を設定する処理です。長期保存を希望する場合のデータ構造を使用しリストの理解.