您的解决方案运行良好,可能是对中小型列表执行此操作的最快方法之一,但它创建了一个不必要的列表(在 python2.x 中)。通常这不是问题,但在少数情况下,取决于对象b,这可能是一个问题。另一个在 python2 和 python 3 中是惰性的是:
':'.join(str(x) for x in b)
python 2.7.3 的一些时间安排:
$ python -m timeit -s 'b = ["x", 2, "y"]' '":".join(map(str,b))'
1000000 loops, best of 3: 1.66 usec per loop
$python -m timeit -s 'b = ["x", 2, "y"]' '":".join([str(x) for x in b])'
1000000 loops, best of 3: 1.49 usec per loop
$ python -m timeit -s 'b = ["x", 2, "y"]' '":".join(str(x) for x in b)'
100000 loops, best of 3: 3.26 usec per loop
$python -m timeit -s 'from itertools import imap; b = ["x", 2, "y"]' '":".join(imap(str,b))'
100000 loops, best of 3: 2.83 usec per loop
python3.2的一些时间安排:
$ python3 -m timeit -s 'b = ["x", 2, "y"]' '":".join(map(str,b))'
100000 loops, best of 3: 2.6 usec per loop
$ python3 -m timeit -s 'b = ["x", 2, "y"]' '":".join([str(x) for x in b])'
100000 loops, best of 3: 2.08 usec per loop
$ python3 -m timeit -s 'b = ["x", 2, "y"]' '":".join(str(x) for x in b)'
100000 loops, best of 3: 3.39 usec per loop
请注意,如果您让循环变得更大,则差异会变得不那么重要:
python2.7.3:
$ python -m timeit -s 'b = list(range(10000))' '":".join(str(x) for x in b)'
100 loops, best of 3: 4.83 msec per loop
$ python -m timeit -s 'b = list(range(10000))' '":".join([str(x) for x in b])'
100 loops, best of 3: 4.33 msec per loop
$ python -m timeit -s 'b = list(range(10000))' '":".join(map(str,b))'
100 loops, best of 3: 3.29 msec per loop
python 3.2.0
$ python3 -m timeit -s 'b = list(range(10000))' '":".join(str(x) for x in b)'
100 loops, best of 3: 6.42 msec per loop
$ python3 -m timeit -s 'b = list(range(10000))' '":".join([str(x) for x in b])'
100 loops, best of 3: 5.51 msec per loop
$ python3 -m timeit -s 'b = list(range(10000))' '":".join(map(str,b))'
100 loops, best of 3: 4.55 msec per loop
*在我的 MacbookPro、OS-X 10.5.8 intel core2duo 上完成所有计时 ....
注意事项,
- python2.x 在所有情况下都比 python3.x 快(对我来说)
- 列表理解对于您的示例列表来说是最快的,但
map 对于更大的列表来说更快。 map 对于小列表可能较慢,因为您需要查找函数,而列表理解不能被“隐藏”,因此不需要执行查找。 HUGE 列表可能还有另一个转折点,其中构建中间列表所需的时间变得很重要。
- 生成器表达式总是最慢的(但在这两种情况下都是懒惰的)