4

これは、実際の問題というよりもプログラミングの演習です。私は、の動作に似たジェネレータ式を探していますappend

検討:

def combine(sequence, obj):
    for item in sequence:
        yield item
    yield obj

s = ''.join(combine(sequence, obj))

このジェネレータは基本的にに似ていappendます。私のプログラムのワークフローでは、上記は同じくらい速いです

sequence.append(obj)
s = ''.join(sequence)

私は今、きちんとしたジェネレータ式があるかどうか疑問に思っていgenexprます

s = ''.join(genexpr)

appendこれは、パフォーマンス上の警告がない上記の動作に似ています。

s = ''.join(_ for a in [sequence, [obj]] for _ in a)

パフォーマンスが悪い。

4

2 に答える 2

4

モジュールchainから使用してみてください:itertools

''.join(chain(sequence, [obj]))

list新しいforを作成したくない場合は、次のobjことを試してください。

''.join(chain(sequence, repeat(obj,1)))

[obj]読みやすく、repeatイテレータのオーバーヘッドがlist作成よりも少ないのではないかと思います。

于 2012-10-21T14:46:34.553 に答える
2

あなたの特定の例についてはよくわかりませんが、a + [b]を使用するだけで、リストが大きい場合でも他のどの例よりも高速であることがわかりました。これが私のテストコードです:

import timeit
from itertools import chain, repeat

a=map(str,range(100000))
b='b'

def combine(sequence,obj):
  for item in sequence:
    yield item
  yield obj

def test1():
  return ','.join(a+[b])

def test2():
  return ','.join(combine(a,b))

def test3():
  return ','.join(chain(a,repeat(b,1)))

def test4():
  return ','.join(chain(a,[b]))

def test5():
  return ','.join(y for x in [a,[b]] for y in x)

count=100
print 'test1: %g'%timeit.timeit(test1,number=count)
print 'test2: %g'%timeit.timeit(test2,number=count)
print 'test3: %g'%timeit.timeit(test3,number=count)
print 'test4: %g'%timeit.timeit(test4,number=count)
print 'test5: %g'%timeit.timeit(test5,number=count)

そして、これが私のシステムでの結果です:

test1: 0.475413
test2: 0.977652
test3: 0.550071
test4: 0.548962
test5: 0.968162
于 2012-10-21T16:39:07.823 に答える