美文网首页
《Python 核心技术与实战》 学习笔记 Day18 深入理解

《Python 核心技术与实战》 学习笔记 Day18 深入理解

作者: _相信自己_ | 来源:发表于2023-02-01 22:06 被阅读0次

    你肯定用过的容器、可迭代对象和迭代器

    在 Python 中一切皆对象,对象的抽象就是类,而对象的集合就是容器。

    列表(list: [0, 1, 2]),元组(tuple: (0, 1, 2)),字典(dict: {0:0, 1:1, 2:2}),集合(set: set([0, 1, 2]))都是容器。对于容器,你可以很直观地想象成多个元素在一起的单元;而不同容器的区别,正是在于内部数据结构的实现方法。

    所有的容器都是可迭代的(iterable),迭代器(iterator)提供了一个 next 的方法。而可迭代对象,通过 iter() 函数返回一个迭代器,再通过 next() 函数就可以实现遍历。for in 语句将这个过程隐式化。

    
    def is_iterable(param):
        try: 
            iter(param) 
            return True
        except TypeError:
            return False
    
    params = [
        1234,
        '1234',
        [1, 2, 3, 4],
        set([1, 2, 3, 4]),
        {1:1, 2:2, 3:3, 4:4},
        (1, 2, 3, 4)
    ]
        
    for param in params:
        print('{} is iterable? {}'.format(param, is_iterable(param)))
    
    ########## 输出 ##########
    
    1234 is iterable? False
    1234 is iterable? True
    [1, 2, 3, 4] is iterable? True
    {1, 2, 3, 4} is iterable? True
    {1: 1, 2: 2, 3: 3, 4: 4} is iterable? True
    (1, 2, 3, 4) is iterable? True
    

    生成器,又是什么?

    生成器是一种特殊的迭代器(注意这个逻辑关系反之不成立)。使用生成器,你可以写出来更加清晰的代码;合理使用生成器,可以降低内存占用、优化程序结构、提高程序速度。

    
    import os
    import psutil
    
    # 显示当前 python 程序占用的内存大小
    def show_memory_info(hint):
        pid = os.getpid()
        p = psutil.Process(pid)
        
        info = p.memory_full_info()
        memory = info.uss / 1024. / 1024
        print('{} memory used: {} MB'.format(hint, memory))
    
    
    def test_iterator():
        show_memory_info('initing iterator')
        list_1 = [i for i in range(100000000)]
        show_memory_info('after iterator initiated')
        print(sum(list_1))
        show_memory_info('after sum called')
    
    def test_generator():
        show_memory_info('initing generator')
        list_2 = (i for i in range(100000000))
        show_memory_info('after generator initiated')
        print(sum(list_2))
        show_memory_info('after sum called')
    
    %time test_iterator()
    %time test_generator()
    
    ########## 输出 ##########
    
    initing iterator memory used: 48.9765625 MB
    after iterator initiated memory used: 3920.30078125 MB
    4999999950000000
    after sum called memory used: 3920.3046875 MB
    Wall time: 17 s
    initing generator memory used: 50.359375 MB
    after generator initiated memory used: 50.359375 MB
    4999999950000000
    after sum called memory used: 50.109375 MB
    Wall time: 12.5 s
    

    相关文章

      网友评论

          本文标题:《Python 核心技术与实战》 学习笔记 Day18 深入理解

          本文链接:https://www.haomeiwen.com/subject/lvfwhdtx.html