あなたのソリューションはうまく機能し、おそらく中小規模のリストに対してこれを行うための最速の方法の1つですが、不要なリストを作成します(python2.x)。通常は問題ありませんが、オブジェクトによっては問題になる場合b
があります。python2とpython3で怠惰なもう1つは次のとおりです。
':'.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.8intelcore2duoで行われました...。
ノート、
- python2.xは、すべての場合でpython3.xよりも高速です(私にとって)
- リスト内包表記は、サンプルリストでは最速ですが、リストが
map
大きいほど高速です。 map
関数を検索する必要があるため、小さなリストの場合はおそらく遅くなりますが、リスト内包表記は「シャドウ」できないため、検索を実行する必要はありません。中間リストの作成にかかる時間が重要になる、巨大なリストの別のターンアラウンドポイントがあるかもしれません。
- ジェネレータ式は常に最も遅いです(ただし、どちらの場合も怠惰です)