<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          list.sort 和 sorted 用哪個比較好?

          共 2142字,需瀏覽 5分鐘

           ·

          2021-11-06 14:17

          排序是編程經(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)注支持,感謝。



          瀏覽 73
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  诱惑无码一区二区三区 | 色图av | 日韩成人18禁 | 九九九视频在线 | 靠逼网站免费 |