繁体   English   中英

Python交换元素

[英]Python swap elements

我知道至少有这两种方法:

array[i], array[j] = array[j], array[i]

和:

temp = array[i]
array[i] = array[j]
array[j] = temp

在我对调用交换函数数十万次的代码的测试中,第二种方法实际上更快。

问题是,我想知道是否有更快的方法。

我想过在外部范围内分配 temp 以便不必在每次调用交换时都分配它,但这没有帮助。

编辑:我正在使用它来实现一个包含数万个堆中元素的最小堆。

另外,我不能使用 numpy。 如果python中的数组类似于链表,那么使用以索引号作为键的字典来模拟真正的数组会更好吗?

在较低级别,交换元素的两种方式之间的唯一区别在于

array[i], array[j] = array[j], array[i]

执行ROT_TWO以交换最顶部的两个堆栈项,而

temp = array[i]
array[i] = array[j]
array[j] = temp

使用临时变量来存储中间结果。
这不会导致任何显着差异,并且这两种方法在性能方面应该几乎相同,即使一些小的差异可能取决于操作系统。 例如,对于我的系统,第一种方法快 1.5%。

所以下面假设数组是一个python List ,它在内存中就像一个链表(不是一个数组,因为它通常在例如'C'中使用)

此外,您不能为变量预先分配空间(就像您尝试使用temp ),因为 Python 中的每个变量都只是对内存地址的引用,因此每次执行temp = array[i] temp 都会分配给array[i]的引用(它已经在内存中,因为它已经在array

您可以尝试使用list(reversed([array]))array[::-1]来反转列表,无论您觉得哪个更易读。

如果你实际上有一个数组(假设这里是numpy ;这更像是一个“C”数组),你可以这样做

swapped_array = array[:, [1, 0]]  # Reads as 'Select all rows (:) of column 1 and then column 0 

这应该是即时的,因为 numpy 不会移动内存中的元素,而只是将第 1 列“分配”到第 0 列,反之亦然。

刚刚看到您在问题中添加了“实现最小堆”。 您可以通过将“当前筛选”值保留在一个额外的变量中而不是在列表中来使其更快一点。

交换两个列表元素:

> python -m timeit -s "a = [1, 2]; i = 0; j = 1" "a[i], a[j] = a[j], a[i]"
2000000 loops, best of 5: 169 nsec per loop

用外部变量交换列表元素:

> python -m timeit -s "x = 1; a = [1, 2]; j = 1" "x, a[j] = a[j], x"
5000000 loops, best of 5: 101 nsec per loop

如果“当前筛选”值保持不变,您甚至可能根本不需要交换:

> python -m timeit -s "a = [1, 2]; i = 0; j = 1" "a[i] = a[j]"
5000000 loops, best of 5: 91.3 nsec per loop

但是,这取决于您的代码,我们仍然看不到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM