Python で、文字列のように機能する変数を作成できますが、内部では文字列のシーケンスを反復処理しますか?
例えば
def function_a():
for i in xrange(100000000):
yield str(i)
これは、文字列のリストを反復処理し、効率的に実行します-一度に1つの文字列のみをメモリに保持します。しかし、私が欲しいのは次のようなものです:
''.join([s for s in function_a()])
しかし、これはナイーブなことをしているだけで、セット全体を反復処理し、それらすべてをメモリ内の 1 つの大きな文字列に連結しているだけだと思います。これに関するもう1つの問題は、変数が必要なことです。実際に結合を行うという醜い作業にユーザーをさらす必要はありません。したがって、おそらくユーザーは次のようなことをするでしょう:
magic_str = get_long_but_memory_efficient_str()
そして、それを使用して効率的に画面に出力します (そして、メモリを解放します):
print magic_str
または、それに対する私の実際の用途は、サーバーへの HTTP ストリームです。
request = urllib2.Request(url, magic_str)
どうやらこのようなものが存在するようです。ファイルをサーバーに効率的にストリーミングするための以下のコードを確認してください (この質問から)。
f = open('somelargefile.zip','rb')
mmapped_file_as_string = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
request = urllib2.Request(url, mmapped_file_as_string)
request.add_header("Content-Type", "application/zip")
response = urllib2.urlopen(request)
しかし、サーバーにストリーミングする文字列を作成しているため、私の場合は異なります。