zoukankan      html  css  js  c++  java
  • python 节省内存的for循环技巧

    python 内存节省的方法

    【问题】 程序创建大量(可能上百万)对象,导致占用大量内存

    【方法】

    一、创建大量的对象

    对于主要当成简单的数据结构类而言,通过添加__slots__属性来极大的减少实例所占用的内存
    eg:

    class Date:
        __slots__ = ['year', 'month', 'day']
        def __init__(self, year, month, day):
            self.year = year
            self.month = month
            self.day = day
    

    原理: 定义__slots__后,python会使用一种更加紧凑的内部表示
    实例通过一个很小的固定大小的数组来构建,而不是为每个实例定义
    一个字典,这跟元组或列表很类似。在__slots__中列出得属性名在
    内部被映射到这个数组的指定小标上。
    缺点

    不能再给实例添加新的属性,只能使用__slots中定义的属性名。
    定义了slots后,类不在支持一些普通类特性, 比如多继承。

    二、 python 循环内存优化之生成器

    打印内容字节数较小时,全部载入内存后,再打印,没有问题。
    可是,如果成千上百万打印数据时,存在out of memory

    常用方法 使用itertools模块

    1、 拼接元素

    itertools中chain()实现元素拼接
    list(chain([1,2], [3,4]))

    底层代码实现:

    def chain(*iterables):
        for it in iterables:
            for it element in it:
                yield element
    
    

    可知,chain 本质上是一个生成器,一次读入一个元素到内存,做到高效节省内存

    2、逐个累加
    返回列表的累积汇总值

    参考连接:http://www.360doc.com/content/19/1221/14/21698786_881183436.shtml

  • 相关阅读:
    Pwn-level3
    【mysql】 mysql忘记密码
    【Linux】linux磁盘管理
    【Linux】Linux系统LVM管理及Raid
    【Git】git撤销与回滚
    【linux】Linux系统SELinux简介
    【Linux】Linux中的网络命令
    【Linux】linux中文本操作利器grep,awk,sed
    【Linux】linux正则表达式及通配符
    【Mysql】mysql数据备份
  • 原文地址:https://www.cnblogs.com/01black-white/p/15506705.html
Copyright © 2011-2022 走看看