在 Python 列表中交换元素的最快方法

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/4554130/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-18 16:17:15  来源:igfitidea点击:

Fastest way to swap elements in Python list

pythonperformance

提问by Gerald Senarclens de Grancy

Is there any any faster way to swap two list elements in Python than

有没有比 Python 中交换两个列表元素更快的方法

L[a], L[b] = L[b], L[a]

or would I have to resort to Cythonor Weaveor the like?

还是我必须求助于CythonWeave之类的?

采纳答案by Ignacio Vazquez-Abrams

Looks like the Python compiler optimizes out the temporary tuple with this construct:

看起来 Python 编译器使用以下构造优化了临时元组:

code:

代码:

import dis

def swap1():
  a=5
  b=4
  a, b = b, a

def swap2():
  a=5
  b=4
  c = a
  a = b
  b = c

print 'swap1():'
dis.dis(swap1)
print 'swap2():'
dis.dis(swap2)

output:

输出:

swap1():
  6           0 LOAD_CONST               1 (5)
              3 STORE_FAST               0 (a)

  7           6 LOAD_CONST               2 (4)
              9 STORE_FAST               1 (b)

  8          12 LOAD_FAST                1 (b)
             15 LOAD_FAST                0 (a)
             18 ROT_TWO             
             19 STORE_FAST               0 (a)
             22 STORE_FAST               1 (b)
             25 LOAD_CONST               0 (None)
             28 RETURN_VALUE        
swap2():
 11           0 LOAD_CONST               1 (5)
              3 STORE_FAST               0 (a)

 12           6 LOAD_CONST               2 (4)
              9 STORE_FAST               1 (b)

 13          12 LOAD_FAST                0 (a)
             15 STORE_FAST               2 (c)

 14          18 LOAD_FAST                1 (b)
             21 STORE_FAST               0 (a)

 15          24 LOAD_FAST                2 (c)
             27 STORE_FAST               1 (b)
             30 LOAD_CONST               0 (None)
             33 RETURN_VALUE        

Two loads, a ROT_TWO, and two saves, versus three loads and three saves. You are unlikely to find a faster mechanism.

两次加载,一次ROT_TWO和两次保存,对比三次加载和三次保存。您不太可能找到更快的机制。

回答by TryPyPy

If you could post a representative code sample, we could do a better job of benchmarking your options. FWIW, for the following dumb benchmark, I get about a 3x speedup with Shed Skinand a 10x speedup with PyPy.

如果您可以发布具有代表性的代码示例,我们可以更好地对您的选项进行基准测试。FWIW,对于以下愚蠢的基准测试,我使用Shed Skin获得了大约 3倍的加速,使用PyPy获得了大约10 倍的加速。

from time import time

def swap(L):
    for i in xrange(1000000):
        for b, a in enumerate(L):
            L[a], L[b] = L[b], L[a]

def main():
    start = time()
    L = list(reversed(range(100)))
    swap(L[:])
    print time() - start
    return L

if __name__ == "__main__":
    print len(main())

# for shedskin:
# shedskin -b -r -e listswap.py && make
# python -c "import listswap; print len(listswap.main())"

回答by Ashish Mohapatra

I found this method as the fastest way to swap two numbers:

我发现这种方法是交换两个数字的最快方法:

mylist   = [11,23,5,8,13,17];
first_el = mylist.pop(0)
last_el  = mylist.pop(-1)
mylist.insert(0, last_el)  
mylist.append(first_el)