簡體   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