2

タプルを左シフトする効率的な方法を探しています。

私がこれまでにしたこと:

def leftShift(tup, n):
    length = len(tup)
    if length != 0:
        n = n % length
    else:
        return tuple()
    return tup[n:] + tup[0:n]

sample = (1,2,3,4)
sample2 = ()

print(leftShift(sample, 5)) #prints (2, 3, 4, 1)
print(leftShift(sample, 1)) #prints (2, 3, 4, 1)
print(leftShift(sample, 15)) #prints (4, 1, 2, 3)
print(leftShift(sample, 3)) #prints (4, 1, 2, 3)
print(leftShift(sample2, 4)) #prints ()

シフトする場所の数は、2番目の引数として指定されます。

効率的ですか?よりPython的な方法でコーディングできますか?

そして教えてください、それは...

length = len(tup)
if length != 0:
    n = n % length

より効率的

if len(tup) != 0:
    n = n % len(tup)

つまり、len(tup)O(1)ですか、それとも後で使用するために覚えておく必要がありますか?

4

2 に答える 2

9

あなたがしていることは絶対的なマイクロ最適化であり、何を目指しているのか正確にわからない場合、これは時間の無駄です。

コードの最初のバージョンは、関数呼び出しが 1 つ少ないため、おそらく高速ですが、どちらも問題ありません。速度が本当に気になる場合は、最初にプロファイラーと timeit モジュールの使用方法を理解する必要があります。

len(tup)一定の時間がかかります。

たぶん、回転メソッドを持つ両端キューが必要ですか?

いくつかの代替手段を次に示します。

def leftShift1(tup, n):
    try:
        n = n % len(tup)
    except ZeroDivisionError:
        return tuple()
    return tup[n:] + tup[0:n]

def leftShift2(tup, n):
    length = len(tup)
    if length != 0:
        n = n % length
    else:
        return tuple()
    return tup[n:] + tup[0:n]

def leftShift3(tup, n):
    if len(tup) != 0:
        n = n % len(tup)
    else:
        return tuple()
    return tup[n:] + tup[0:n] 

def leftShift4(tup, n):
    if tup:
        n = n % len(tup)
    else:
        return tuple()
    return tup[n:] + tup[0:n]

sample= tuple(range(10))

ランダムな時間の結果

D:\downloads>python -m timeit -s"from asd import *" "leftShift1(sample, 20)"
1000000 loops, best of 3: 0.472 usec per loop

D:\downloads>python -m timeit -s"from asd import *" "leftShift2(sample, 20)"
1000000 loops, best of 3: 0.533 usec per loop

D:\downloads>python -m timeit -s"from asd import *" "leftShift3(sample, 20)"
1000000 loops, best of 3: 0.582 usec per loop

D:\downloads>python -m timeit -s"from asd import *" "leftShift4(sample, 20)"
1000000 loops, best of 3: 0.474 usec per loop

そう:

  • 最も Pythonic コード (try .. exceptおよびif tup:) が最も高速です。そのためには Python を愛さなければなりません。
  • 0.0000001 秒という信じられないほどの時間を節約できます。
于 2011-03-14T13:30:35.227 に答える
6

もう少し簡潔に

def leftShift(tup, n):
    if not tup or not n:
        return tup
    n %= len(tup)
    return tup[n:] + tup[:n]
于 2011-03-14T13:28:53.570 に答える