list.sort 和 sorted 用哪個比較好?
排序是編程經(jīng)常遇到的場景,在 Python 中,對一個列表進(jìn)行排序有兩種方法,一個是 list.sort 可以對列表原地排序,另一個是 Python 的內(nèi)建方法 sorted,它不改變原始列表,而是返回一個新的列表,那到底用哪一個呢?
如果你不想改變原始列表,那肯定選擇 sorted 啊,如果改變不改變都無所謂呢?本文就來回到這個問題。
可以先大膽猜測一下,sorted 不改變原始列表,相當(dāng)于內(nèi)部對列表進(jìn)行了深 copy,這個過程必然更占用內(nèi)存,更慢一些。
現(xiàn)在我們通過實(shí)際運(yùn)行來比較一下:
內(nèi)存占用比較
先看下結(jié)果:

代碼:
import?random
import?resource
import?sys
import?time
from?sniffing?import?FunctionSniffingClass
def?list_sort(arr):
????return?arr.sort()
def?sorted_builtin(arr):
????return?sorted(arr)
if?__name__?==?"__main__":
????if?len(sys.argv)?!=?2:
????????sys.exit("Please?run:?python?(sort|sorted)")
????elif?sys.argv[1]?==?"sorted":
????????func?=?sorted_builtin
????elif?sys.argv[1]?==?"sort":
????????func?=?list_sort
????else:
????????sys.exit("Please?run:?python?(sort|sorted)")
????#?Lib?Testing?Code
????arr?=?[random.randint(0,?50)?for?r?in?range(1_000_000)]
????mythread?=?FunctionSniffingClass(func,?arr)
????mythread.start()
????used_mem?=?0
????max_memory?=?0
????memory_usage_refresh?=?0.005??#?Seconds
????while?1:
????????time.sleep(memory_usage_refresh)
????????used_mem?=?resource.getrusage(resource.RUSAGE_SELF).ru_maxrss
????????if?used_mem?>?max_memory:
????????????max_memory?=?used_mem
????????#?Check?to?see?if?the?function?call?is?complete
????????if?mythread.isShutdown():
????????????#?Uncomment?if?yu?want?to?see?the?results
????????????#?print(mythread.results)
????????????break
????print("\nMAX?Memory?Usage:",?round(max_memory?/?(2?**?20),?3),?"MB")
很明顯,內(nèi)建的 sorted 函數(shù)占用的內(nèi)存更多。代碼用到了 FunctionSniffingClass 類,這里就不展開了,完整代碼請?jiān)L問:https://github.com/DahlitzFlorian/list-sort-vs-sorted-list/tree/master/memory_measurement
速度比較

測試代碼:
import?random
from?somedecorators?import?timeit
@timeit()
def?list_sort(arr):
????return?arr.sort()
@timeit()
def?sorted_builtin(arr):
????return?sorted(arr)
def?main():
????arr?=?[random.randint(0,?50)?for?r?in?range(10_000_000)]
????sorted_builtin(arr)
????list_sort(arr)
if?__name__?==?"__main__":
????main()
最后
從結(jié)果來看,符合預(yù)期,如果不考慮是否改變原始列表的順序,無論是內(nèi)存占用還是速度,list.sort 總是更優(yōu)秀。
但是,請記住,這 list.sort 僅適用于列表,而 sorted 接受任何可迭代對象。此外,如果您使用 list.sort,您將丟失原始列表的次序。
如果有幫助,請點(diǎn)贊、在看、關(guān)注支持,感謝。
評論
圖片
表情
