我一直在尝试应用一种算法,根据某些标准将Python列表缩小到更小的规模。由于原始列表的数量很大,约为10万个元素,所以我尝试使用itertools来避免多次内存分配,因此我想出了以下解决方案:
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包含大约100k个元素时,执行此操作的时间会非常长,令人担忧,需要几分钟的时间。当我尝试使用以下方法时:
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", i, i+ratio)
代替sum( 1 for x in vec[i:i+ratio] if x == 'F' )
怎么样?在我看来,这样更易读,而且可能更快。 - Elmar Zander