采纳的答案是正确的,但我进行了一些效率测试,所以分享给过路人。
总结:使用chain.from_iterable
可以比列表推导式提高约两倍的速度。如果你不介意导入numpy
,则使用np.repeat
可以提高约六倍的速度,但是如果最终转回list
,不要使用np.repeat
。
In [1]: from itertools import chain
...: import numpy as np
...:
...: def nested_list_comprehension(seq, repeats):
...: return [v for v in seq for _ in range(repeats)]
...:
...: def chain_from_iterable_tuple(seq, repeats):
...: return list(chain.from_iterable((v,) * repeats for v in seq))
...:
...: def chain_from_iterable_list(seq, repeats):
...: return list(chain.from_iterable([v] * repeats for v in seq))
...:
...: def numpy_repeat_list(seq, repeats):
...: return list(np.repeat(seq, repeats))
...:
...: def numpy_repeat(seq, repeats):
...: return np.repeat(seq, repeats)
In [2]: seq = list(range(1000))
...: repeats = 100
In [3]: assert (
...: nested_list_comprehension(seq, repeats)
...: == chain_from_iterable_tuple(seq, repeats)
...: == chain_from_iterable_list(seq, repeats)
...: == numpy_repeat_list(seq, repeats)
...: )
In [4]: %timeit nested_list_comprehension(seq, repeats)
...: %timeit chain_from_iterable_tuple(seq, repeats)
...: %timeit chain_from_iterable_list(seq, repeats)
...: %timeit numpy_repeat_list(seq, repeats)
...: %timeit numpy_repeat(seq, repeats)
1.53 ms ± 2.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
814 µs ± 3.79 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
842 µs ± 2.02 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
3.65 ms ± 22.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
268 µs ± 1.44 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
sum([[i] * 3 for i in [1,2]], [])
。 - undefined