排序是编程中经常遇到的场景。在Python中,有两种方法可以对列表进行排序。一是清单。更改原始列表,但返回一个新列表,您应该使用哪个?如果你不想改变原来的列表,那么你必须选择sorted。改不改无所谓?本文将回到这个问题。你可以先大胆猜测一下。sorted并没有改变原来的列表,相当于内部对列表进行深拷贝。这个过程必然会占用更多的内存,速度也会变慢。下面通过实际运行来对比一下:内存使用对比先看结果:代码:importrandomimportresourceimportsysimporttimefromsniffingimportFunctionSniffingClassdeflist_sort(arr):returnarr.sort()defsorted_builtin(arr):returnsorted(arr)if__name__=="__main__":iflen(sys.argv)!=2:sys.exit("Pleaserun:python(sort|sorted)")elifsys.argv[1]=="sorted":func=sorted_builtinelifsys.argv[1]=="sort":func=list_sortelse:sys.exit("Pleaserun:python(sort|sorted)")#LibTestingCodarr=[random.randint(0,50)forrinrange(1_000_000)]mythread=FunctionSniffingClass(func,arr)mythread.start()used_mem=0max_memory=0memory_usage_refresh=0.005#Secondswhile1:time.sleep(memory_usage_refresh)used_mem=resource.getrusage(resource.RUSAGE_SELF).ru_maxrssifused_mem>max_memory:max_memory=used_mem#Checktoseeifthefunctioncalliscompleteifmythread.isShutdown():#Uncommentifyuwanttoseetheres#print(mythread.result):",round(max_memory/(2**20),3),"MB")显然,内置的sorted函数占用内存较多,代码中使用了FunctionSniffingClass类,这里不再展开。完整代码请访问:https://github.com/DahlitzFlorian/list-sort-vs-sorted-list/tree/master/memory_measurement速度对比测试代码:importrandomfromsomedecoratorsimporttimeit@timeit()deflist_sort(arr):returnarr.sort()@timeit()defsorted_builtin(arr):returnsorted(arr)defmain():arr=[random.randint(0,50)forrinrange(10_000_000)]sorted_builtin(arr)list_sort(arr)if__name__=="__main__":main()最后从结果来看,是不出所料,如果你不考虑是否改变原始列表的顺序,list.sort在内存占用和速度方面总是更胜一筹。但是,请记住,list.sort仅适用于列表,而已排序接受任何可迭代的。另外,如果你使用list.sort,你将失去原始列表的顺序。