Python交换元素

问题描述 投票:-1回答:3

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

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

和:

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

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

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

我考虑过在外部范围中分配temp,这样就不必在每次调用swap时都分配temp,但这没有帮助。

编辑:我正在使用它来实现一个最小堆,该最小堆中有成千上万个元素。

而且,我不能使用numpy。如果python中的数组就像链表一样,使用索引号为键的字典来模拟一个真实的数组会更好吗?

python arrays swap
3个回答
0
投票

因此,以下内容假设数组是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列,反之亦然。


0
投票

在较低级别上,两种交换元素的唯一区别在于:


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.