List データ構造を使用することは、これを行う効率的な方法ではありません。キューの方が適切です。いかなる場合でも:
キューの使用
私が提案したように、Queue ( collections.deque ) を使用します。
>>> q = collections.deque([1,2,3,4,5,6,7,8])
>>> for _ in xrange(5):
... q.rotate(-1)
...
>>> q
deque([6, 7, 8, 1, 2, 3, 4, 5])
リストを維持する
>>> a = [1,2,3,4,5,6,7,8]
>>> for _ in xrange(5):
... a = a[1:] + a[:1]
...
>>> a
[6, 7, 8, 1, 2, 3, 4, 5]
または(前のものより速い):
>>> a = [1,2,3,4,5,6,7,8]
>>> for _ in xrange(5):
... a.append(a.pop(0))
...
>>> a
[6, 7, 8, 1, 2, 3, 4, 5]
ここで、反復したいものに対して xrange を変更できます。
Timeit 分析:
ポップアペンド
>>> timeit.timeit('a.append(a.pop(0))', setup='a = [0,1,2,3,4,5,6,7,8,9]', number=1000000)
0.24548697471618652
>>> timeit.timeit('a.append(a.pop(0))', setup='a = [0,1,2,3,4,5,6,7,8,9]', number=100000000)
23.65538215637207
スライス
>>> timeit.timeit('a=a[1:] + a[:1]', setup='a = [0,1,2,3,4,5,6,7,8,9]', number=1000000)
0.36037278175354004
>>> timeit.timeit('a=a[1:] + a[:1]', setup='a = [0,1,2,3,4,5,6,7,8,9]', number=100000000)
35.06173801422119
列
>>> timeit.timeit('q.rotate(-1)', setup='import collections; q = collections.deque([0,1,2,3,4,5,6,7,8])', number=1000000)
0.16829514503479004
>>> timeit.timeit('q.rotate(-1)', setup='import collections; q = collections.deque([0,1,2,3,4,5,6,7,8])', number=100000000)
16.012277841567993
少し最適化して、基本的に追加、ポップ、回転の __getattr__ 呼び出しを削除します。
ポップアペンド
>>> timeit.timeit('aa(ap(0))', setup='a = [0,1,2,3,4,5,6,7,8,9]; aa=a.append; ap=a.pop', number=1000000)
0.15255093574523926
>>> timeit.timeit('aa(ap(0))', setup='a = [0,1,2,3,4,5,6,7,8,9]; aa=a.append; ap=a.pop', number=100000000)
14.50795292854309
列
>>> timeit.timeit('r(-1)', setup='import collections; q = collections.deque([0,1,2,3,4,5,6,7,8]); r=q.rotate', number=1000000)
0.13374090194702148
>>> timeit.timeit('r(-1)', setup='import collections; q = collections.deque([0,1,2,3,4,5,6,7,8]); r=q.rotate', number=100000000)
11.435136079788208