美文网首页
《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核心技术与实战笔记目录

    参考资料: 极客时间 Python核心技术与实战学习 Python核心技术与实战(极客时间)链接:http://g...

  • Python对象的比较和拷贝

    李文轩 2019-08-17声明:这是本人学习极客时间的Python核心技术与实战的笔记,有侵权请联系我。 ' =...

  • android 书籍

    深入理解 Android 内核设计思想 实战Gradle kotlin实战 编程珠玑 编程之美 java核心技术卷...

  • Python03 字符串

    以下主要是听极客时间:Python核心技术与实战时做的笔记 字符串是python一种常见的数据类型,比如函数的注释...

  • Python02 数据结构:字典和集合

    以下主要是听极客时间:Python核心技术与实战时做的笔记 对于每一门编程语言,数据结构都是重中之重。对于Pyth...

  • Python01 数据结构:列表和元组

    以下主要是听极客时间:Python核心技术与实战时做的笔记 对于每一门编程语言,数据结构都是重中之重。对于Pyth...

  • 极客时间

    我的已购专栏。 左耳听风 黄勇的OKR实战笔记 Kafka核心技术与实战 OpenResty从入门到实战 Java...

  • Redis线程那些事

    本文作为学习笔记,文章内容来自“极客时间”专栏《Redis核心技术与实战》,如有侵权,请告知,必即时删除。 Red...

  • 针对Redis内存碎片以及缓冲区溢出的优化

    本文作为学习笔记,文章内容来自“极客时间”专栏《Redis核心技术与实战》,如有侵权,请告知,必即时删除。 1、内...

  • Redis缓存淘汰策略

    本文作为学习笔记,文章内容来自“极客时间”专栏《Redis核心技术与实战》,如有侵权,请告知,必即时删除。 1、淘...

网友评论

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

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