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