我一直在尝试应用一种算法,以基于特定标准将python列表缩小为较小的列表。由于大量的原单,在100K元素的顺序,我试图itertools为避免多次内存分配,所以我想出了这个:itertools.islice与列表片段比较
reducedVec = [ 'F' if sum(1 for x in islice(vec, i, i+ratio) if x == 'F')
> ratio/3.0 else 'T'
for i in xrange(0, len(vec), ratio) ]
执行时间为这需要一个令人担忧的长时间几分钟的顺序,当vec有大约10万个元素时。当我试图代替:
reducedVec = [ 'F' if sum(1 for x in vec[i:i+ratio] if x == 'F')
> ratio/3.0 else 'T'
for i in xrange(0, len(vec), ratio) ]
在本质上与切片执行是瞬间取代islice。
你能想出一个合理的解释吗?我会想,避免重复分配一个新的列表与大量的元素,实际上会节省我几个计算周期,而不是削弱整个执行。
干杯, 忒弥斯
可阅读有关使用''vec.count(“F”是什么,我,我+比值)''而不是'sum'(如果x =='F')'',vec [i:i +比率]在我看来,它更具可读性,可能也更快。 – 2011-11-24 11:26:11