2024-04-23 06:23:20 发布
网友
假设我有一个Python列表,如下所示:
list = [ a, b, c, d]
我正在寻找最有效的方式来实现这一点:
因此,如果列表有N个元素,那么第一个元素被克隆N-1次,第二个元素被克隆N-2次,依此类推……最后一个元素被克隆N-N次或0次。关于如何在大名单上有效地做到这一点的任何建议。在
>>> items = ['a', 'b', 'c', 'd'] >>> [item for i, item in enumerate(items) for j in xrange(len(items) - i)] ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd']
首先,我们使用enumerate同时提取索引和值。然后我们使用一个嵌套的for循环,以减少对每个项的迭代次数。(请注意,变量j从未使用过。它是垃圾。)
enumerate
j
由于使用了enumerate和xrange生成器,这应该是接近最佳的,内存使用量最小。在
xrange
请注意,我测试的是速度,而不是正确性。如果有人想在单元测试中进行编辑,我会尽力的。在
pyfunc_fastest: 152.58769989 usecs pyfunc_local_extend: 154.679298401 usecs pyfunc_iadd: 158.183312416 usecs pyfunc_xrange: 162.234091759 usecs pyfunc: 166.495800018 usecs Ignacio: 238.87629509 usecs Ishpeck: 311.713695526 usecs FabrizioM: 456.708812714 usecs JohnKugleman: 519.239497185 usecs Bwmat: 1309.29429531 usecs
测试代码here。第二次修订是垃圾,因为我正赶着让每个人都在我第一批测试后发布的测试。这些时间安排适用于第五次修订的规范。在
这是我能得到的最快版本。在
奇怪的是,我修改了一个版本,用enumerate来避免索引到列表中,它的运行速度比原来的慢。在
这个怎么样-一个简单的
>>> x = ['a', 'b', 'c', 'd'] >>> t = [] >>> lenList = len(x) >>> for l in range(0, lenList): ... t.extend([x[l]] * (lenList - l)) ... >>> t ['a', 'a', 'a', 'a', 'b', 'b', 'b', 'c', 'c', 'd'] >>>
首先,我们使用
enumerate
同时提取索引和值。然后我们使用一个嵌套的for循环,以减少对每个项的迭代次数。(请注意,变量j
从未使用过。它是垃圾。)由于使用了
enumerate
和xrange
生成器,这应该是接近最佳的,内存使用量最小。在请注意,我测试的是速度,而不是正确性。如果有人想在单元测试中进行编辑,我会尽力的。在
测试代码here。第二次修订是垃圾,因为我正赶着让每个人都在我第一批测试后发布的测试。这些时间安排适用于第五次修订的规范。在
这是我能得到的最快版本。在
^{pr2}$奇怪的是,我修改了一个版本,用
enumerate
来避免索引到列表中,它的运行速度比原来的慢。在这个怎么样-一个简单的
相关问题 更多 >
编程相关推荐