最简单的方法是在下面的cyclezip1
。它对于大多数目的来说足够快。
import itertools
def cyclezip1(it1, it2, count):
pairs = itertools.izip(itertools.cycle(iter1),
itertools.cycle(iter2))
return itertools.islice(pairs, 0, count)
这里是它的另一个实现,大约快两倍,当count
大于it1
和it2
最小公倍数显著较大。
import fractions
def cyclezip2(co1, co2, count):
l1 = len(co1)
l2 = len(co2)
lcm = l1 * l2/float(fractions.gcd(l1, l2))
pairs = itertools.izip(itertools.cycle(co1),
itertools.cycle(co2))
pairs = itertools.islice(pairs, 0, lcm)
pairs = itertools.cycle(pairs)
return itertools.islice(pairs, 0, count)
在这里,我们采取的事实,即对将他们的第一n
其中n
是len(it1)
和len(it2)
最不常见的复式后周期。这当然假定iterables是集合,因此要求它们的长度是有意义的。可以做了进一步的优化是 更换线
pairs = itertools.islice(pairs, 0, lcm)
与
pairs = list(itertools.islice(pairs, 0, lcm))
这是几乎没有显着的改善(在我的测试约2%),几乎没有一致。它也需要更多的内存。如果预先知道it1
和it2
要足够小,以便额外的内存可以忽略不计,那么可以从中挤出额外的性能。
有趣的是,在收集的情况下,显而易见的事情比第一个选项慢四倍。
def cyclezip3(co1, co2, count):
l1 = len(co1)
l2 = len(co2)
return ((co1[i%l1], co2[i%l2]) for i in xrange(count))
简单胜利! – cwall 2010-09-24 17:23:38