加入列表:
>>> ''.join([ str(_) for _ in xrange(10) ])
'0123456789'
join
必须采用可迭代对象。
显然,join
的参数是[ str(_) for _ in xrange(10) ]
,它是一个list comprehension。
看看这个:
>>>''.join( str(_) for _ in xrange(10) )
'0123456789'
现在,join
的参数只是 str(_) for _ in xrange(10)
,没有 []
,但是结果是一样的。
为什么? str(_) for _ in xrange(10)
是否也产生列表或可迭代对象?
最佳答案
其他受访者正确回答您发现了 generator expression (它的符号类似于列表推导式,但没有方括号)。
一般来说,基因表达式(因为它们被亲切地称为)比列表推导更节省内存和更快。
然而,在 ''.join()
的情况下,列表推导式更快,内存效率更高。原因是 join 需要对数据进行两次传递,所以它实际上需要一个真实的列表。如果你给它一个,它可以立即开始工作。如果你给它一个 genexp,它就不能开始工作,直到它通过运行 genexp 在内存中建立一个新的列表到耗尽:
~ $ python -m timeit '"".join(str(n) for n in xrange(1000))'
1000 loops, best of 3: 335 usec per loop
~ $ python -m timeit '"".join([str(n) for n in xrange(1000)])'
1000 loops, best of 3: 288 usec per loop
比较 itertools.imap 和 map 的结果相同:
~ $ python -m timeit -s'from itertools import imap' '"".join(imap(str, xrange(1000)))'
1000 loops, best of 3: 220 usec per loop
~ $ python -m timeit '"".join(map(str, xrange(1000)))'
1000 loops, best of 3: 212 usec per loop
关于python - Python中不带[]的列表理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9060653/