这更像是一个编程练习而不是现实世界的问题:我正在寻找一个类似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)
表现不好。
答案 0 :(得分:4)
尝试使用itertools
模块中的chain
:
''.join(chain(sequence, [obj]))
如果您不想为list
创建新的obj
,那么您可以试试这个:
''.join(chain(sequence, repeat(obj,1)))
我会使用[obj]
,因为它更具可读性,我怀疑repeat
迭代器的开销比创建list
的开销少。
答案 1 :(得分:2)
我不确定你的具体例子,但我发现即使使用大型列表,只使用+ [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