Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python列表中交换元素的最快方法_Python_Performance - Fatal编程技术网

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

在Python列表中交换元素的最快方法,python,performance,Python,Performance,在Python中交换两个列表元素有没有比 L[a], L[b] = L[b], L[a] 或者我必须求助于或之类的方法吗?看起来Python编译器使用以下构造优化了临时元组: 代码: 输出: 两次加载、一次加载和两次保存,而三次加载和三次保存。您不太可能找到更快的机制。如果您能发布一个具有代表性的代码示例,我们可以更好地对您的选项进行基准测试。FWIW,对于以下愚蠢的基准测试,我得到了大约3倍的加速比和10倍的加速比 我发现这种方法是交换两个数字的最快方法: mylist = [11,23

在Python中交换两个列表元素有没有比

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

或者我必须求助于或之类的方法吗?

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

代码: 输出:
两次加载、一次加载和两次保存,而三次加载和三次保存。您不太可能找到更快的机制。

如果您能发布一个具有代表性的代码示例,我们可以更好地对您的选项进行基准测试。FWIW,对于以下愚蠢的基准测试,我得到了大约3倍的加速比和10倍的加速比


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

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)

不,不是开玩笑。我正在实施一个算法,在这个算法中,这项工作要进行数十亿次(取决于问题的大小),我想知道是否有什么简单的方法可以加速这项工作。在尝试加速这个特定的交换之前,可能有很多方法可以加速您的程序。有点背景可能会很有趣。在我的硕士项目中处理过类似的TSP局部搜索问题后,我可以告诉你,你会A)想选择一个比2-Opt更好的算法,b)Psyco(或Cython等)是你的朋友。Gerald,如果你感兴趣,我想我仍然有一个简单的Tkinter GUI,它可以读取TSPLIB问题,并在单独的线程中(通过2-Opt)解决问题时显示它们。这有助于可视化您的算法是否正常运行。@UkuLoskit:别傻了。谢谢您尝试shedskin。当我尝试这个程序时,我看到了大约100倍的加速。您还记得您使用的shedskin的哪个版本吗?先生,您刚刚向我展示了我喜欢python的另一个原因。我从来都不知道“dis”有多可怕!!谢谢你让我们知道dis
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        
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())"
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)