- 1.引用计数法
- 2.标记清除、分代收集算法
- 3.小整数和大整数对象池(内存优化)
- 4.规范
- 5.命令行参数_sys
- 6.命令行参数_argparse
1.引用计数法
注:类似于java,这个系统自动回收垃圾对象,明显有循环引用的弊端。
- 代码例子
import sys import psutil import os import gc print(gc.get_threshold()) def showMemSize(tag): pid=os.getpid() p=psutil.Process(pid) info=p.memory_full_info() memory=info.uss/1024/1024 print('{} memory used:{} MB'.format(tag,memory)) pass # 验证循环引用的情况 def func(): showMemSize('初始化') a=[i for i in range(10000000)] b=[i for i in range(10000000)] a.append(b) b.append(a) showMemSize('创建列表对象 a b 之后') # print(sys.getrefcount(a)) # print(sys.getrefcount(b)) # del a # del b pass func() gc.collect() #手动是释放的 showMemSize('完成时候的') # sys.getrefcount() # a=[] # print(sys.getrefcount(a)) #两次 # b=a # print(sys.getrefcount(a)) #三次 # c=b # d=b # e=c # f=e # g=d # print(sys.getrefcount(a)) #八次
- 标记清楚:先标记对象,然后清除垃圾(java的可达性分析)
- 类似于java的字符串常量池
- 大整数池和小整数池的区别是:
1 从结果来看是一样的
2 大整数池是没有提前的创建好对象,是个空池子,需要我们自己去创建,创建好之后,会把整数对象保存到池子里面,后面都不需要再创建了 直接拿来使用;小整数池是提前将【-5,256】的数据都提前创建好; 字符串的驻留共享机制intern机制a=140 b=140 print(id(a)) print(id(a)) # del a # del b # c=140 # print(id(c)) # biga=100000 # bigb=100000 # print(id(biga)) # print(id(bigb)) # del biga # del bigb # bigc=100000 # print(id(bigc)) # sa='ab_c' # sb='ab_c' # sc='ab_c' # sd='ab_c'
- 缩进:4个空格的缩进
- 添加注释
- 命名规范:类–大驼峰法,方法–小驼峰法
-
sys模块
import sys import argparse print('参数个数为:', len(sys.argv), '个参数.') print('参数列表:', str(sys.argv[1:])) -
执行结果
-
弊端:
-
argparse为首选
# 创建一个解析器对象 parse=argparse.ArgumentParser(prog='my - 我自己的程序', usage='%(prog)s [options] usage', description = 'my-编写自定义命令行的文件',epilog = 'my - epilog') # 添加位置参数【必选参数】 parse.add_argument('name',type=str, help='你自己的名字') parse.add_argument('age',type=str,help='你的年龄') # 添加可选参数 # parse.add_argument('-s','--sex', action='append',type=str,help='你的性别') # 限定一个范围 parse.add_argument('-s','--sex',default='男', choices=['男','femal','女','male'],type=str,help='你的性别') # print(parse.print_help()) result=parse.parse_args() #开始解析参数 print(result.name,result.age,result.sex) -
构造对象的参数说明
-
参数的属性



