【发布时间】:2015-03-17 00:38:31
【问题描述】:
我需要一个 python 函数,它可以采用以下形式的字符串列表:
seq = ['A[0]','B[2:5]','A[4]']
并返回具有保留顺序的“扩展”元素的新列表,如下所示:
expanded = ['A[0]', 'B[2]', 'B[3]', 'B[4]', 'B[5]', 'A[4]']
为了实现我的目标,我编写了这个简单的函数:
def expand_seq(seq):
#['item[i]' for item in seq for xrange in item]
return ['%s[%s]'%(item.split('[')[0],i) for item in seq for i in xrange(int(item.split('[')[-1][:-1].split(':')[0]),int(item.split('[')[-1][:-1].split(':')[-1])+1)]
在处理生成少于 500k 个项目的序列时,它运行良好,但在生成非常大的列表(超过 100 万个)时,它会减慢很多。例如:
# let's generate 10 million items!
seq = ['A[1:5000000]','B[1:5000000]']
t1 = time.clock()
seq = expand_seq(seq)
t2 = time.clock()
print round(t2-t1, 3)
# RESULT: 9.541 seconds
我正在寻找改进此功能的方法,并希望在处理大型列表时加快它的速度。如果有人有建议,我很乐意听取他们的意见!
【问题讨论】:
-
听起来像是发电机的工作。
-
通过迭代
xrange在列表中创建 10,000,000 个元素预计会很慢。您将如何处理生成的数据? -
适当的优化很大程度上取决于您之后想要对列表执行的操作。如果您可以/想要一个一个地处理生成的元素,那么生成器将是您的选择。如果你想做其他事情,那么它可能会更复杂。
标签: python python-2.7