如何有效地左移一个元组?

时间:2011-03-14 13:22:58

标签: python tuples shift

我正在寻找一种有效的方法来左移一个元组。

到目前为止我做了什么:

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 ()

要转移的地方数量作为第二个参数。

有效吗?可以用更多的Pythonic方式编码吗?

告诉我,是吗......

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

更有效率
if len(tup) != 0:
    n = n % len(tup)

我的意思是,是len(tup) O(1)还是我应该记住它供以后使用?

2 个答案:

答案 0 :(得分:9)

你所做的是绝对的微观优化,如果你不确切地知道你的目标是什么,这是完全浪费时间。

您的代码的第一个版本可能更快,因为它使用少一个函数调用,但两者都很好。如果你真的关心速度,你应该首先弄清楚如何使用分析器和timeit模块。

len(tup)需要一段时间。

也许您想要一个具有旋转方法的deque

以下是一些替代方案:

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 .. exceptif tup:)是最快的。一定要喜欢Python。
  • 您可以节省令人难以置信的0.0000001秒。

答案 1 :(得分:6)

更简洁一点

def leftShift(tup, n):
    if not tup or not n:
        return tup
    n %= len(tup)
    return tup[n:] + tup[:n]