文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

List.sort 和 Sorted 用哪个比较好?

2024-12-02 17:34

关注

排序是编程经常遇到的场景,在 Python 中,对一个列表进行排序有两种方法,一个是 list.sort 可以对列表原地排序,另一个是 Python 的内建方法 sorted,它不改变原始列表,而是返回一个新的列表,那到底用哪一个呢?

如果你不想改变原始列表,那肯定选择 sorted 啊,如果改变不改变都无所谓呢?本文就来回到这个问题。

可以先大胆猜测一下,sorted 不改变原始列表,相当于内部对列表进行了深 copy,这个过程必然更占用内存,更慢一些。

现在我们通过实际运行来比较一下:

内存占用比较

先看下结果:

代码:

  1. import random 
  2. import resource 
  3. import sys 
  4. import time 
  5. from sniffing import FunctionSniffingClass 
  6.  
  7. def list_sort(arr): 
  8.     return arr.sort() 
  9.  
  10.  
  11. def sorted_builtin(arr): 
  12.     return sorted(arr) 
  13.  
  14. if __name__ == "__main__"
  15.     if len(sys.argv) != 2: 
  16.         sys.exit("Please run: python (sort|sorted)"
  17.     elif sys.argv[1] == "sorted"
  18.         func = sorted_builtin 
  19.     elif sys.argv[1] == "sort"
  20.         func = list_sort 
  21.     else
  22.         sys.exit("Please run: python (sort|sorted)"
  23.  
  24.     # Lib Testing Code 
  25.     arr = [random.randint(0, 50) for r in range(1_000_000)] 
  26.     mythread = FunctionSniffingClass(func, arr) 
  27.     mythread.start() 
  28.  
  29.     used_mem = 0 
  30.     max_memory = 0 
  31.     memory_usage_refresh = 0.005  # Seconds 
  32.  
  33.     while 1: 
  34.         time.sleep(memory_usage_refresh) 
  35.         used_mem = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 
  36.         if used_mem > max_memory: 
  37.             max_memory = used_mem 
  38.  
  39.         # Check to see if the function call is complete 
  40.         if mythread.isShutdown(): 
  41.             # Uncomment if yu want to see the results 
  42.             # print(mythread.results) 
  43.             break 
  44.  
  45.     print("\nMAX Memory Usage:", round(max_memory / (2 ** 20), 3), "MB"

很明显,内建的 sorted 函数占用的内存更多。代码用到了 FunctionSniffingClass 类,这里就不展开了,完整代码请访问:https://github.com/DahlitzFlorian/list-sort-vs-sorted-list/tree/master/memory_measurement

速度比较

测试代码:

  1. import random 
  2.  
  3. from somedecorators import timeit 
  4.  
  5. @timeit() 
  6. def list_sort(arr): 
  7.     return arr.sort() 
  8.  
  9.  
  10. @timeit() 
  11. def sorted_builtin(arr): 
  12.     return sorted(arr) 
  13.  
  14.  
  15. def main(): 
  16.     arr = [random.randint(0, 50) for r in range(10_000_000)] 
  17.  
  18.     sorted_builtin(arr) 
  19.  
  20.     list_sort(arr) 
  21.  
  22. if __name__ == "__main__"
  23.     main() 

最后

从结果来看,符合预期,如果不考虑是否改变原始列表的顺序,无论是内存占用还是速度,list.sort 总是更优秀。

但是,请记住,这 list.sort 仅适用于列表,而 sorted 接受任何可迭代对象。此外,如果您使用 list.sort,您将丢失原始列表的次序。

 

来源:Python七号内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯