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

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

[[433436]]

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

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

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

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

内存占用比较

先看下结果:

代码:

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"
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.

很明显,内建的 sorted 函数占用的内存更多。代码用到了 FunctionSniffingClass 类,这里就不展开了,完整代码请访问: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() 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.

最后

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

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

 

责任编辑:武晓燕 来源: Python七号
相关推荐

2021-11-11 07:02:33

类型函数调用

2023-09-14 15:48:53

排序测试

2021-11-30 23:01:51

编程语言数据Python

2009-09-15 09:24:42

思科认证考试思科认证

2021-08-05 08:32:45

TypeScript InterfaceType

2020-09-23 16:53:46

Python编辑器工具

2018-06-16 14:32:16

无线路由器单频双频

2024-10-28 21:11:52

2024-02-22 15:31:46

Python排序

2010-03-29 17:38:18

CentOS源代码

2021-03-15 14:09:49

电脑软件安全

2020-01-17 13:33:42

大数据分析师大数据工程师

2011-10-26 20:34:24

ssh 客户端

2020-12-08 15:54:15

编程语言Python

2020-11-18 09:26:52

@property装饰器代码

2020-06-30 09:10:35

编程学习技术

2020-07-28 10:40:26

大数据专业技术

2015-01-08 22:06:18

2022-06-06 15:06:42

MySQLJAVA
点赞
收藏

51CTO技术栈公众号