【发布时间】:2010-04-29 14:25:55
【问题描述】:
我一直在尝试应用一种算法来根据特定标准将 python 列表缩减为更小的列表。由于原始列表的体积很大,大约有 100k 个元素,我尝试使用 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' )怎么样?在我看来,它更具可读性并且可能更快。
标签: python performance iteration