Python的内存管理与垃圾回收机制

在使用真格量化时,一些用户希望了解如何来提高系统性能。通过了解Python的内存管理和垃圾回收机制,我们可以有针对性地去提高策略代码性能。

 

 

Python内存管理机制  

 

Python的内存管理机制:引入计数、垃圾回收、内存池机制

 

 

 


一、变量与对象

关系图如下:

1、变量,通过变量指针引用对象

  变量指针指向具体对象的内存空间,取对象的值。

 

2、对象,类型已知,每个对象都包含一个头部信息(头部信息:类型标识符和引用计数器)

 

  变量名没有类型,类型属于对象(因为变量引用对象,所以类型随对象),变量引用什么类型的对象,变量就是什么类型的。

 

我们可以用id函数来检查变量是否使用了同一内存空间。id()是python的内置函数,用于返回对象的身份,即对象的内存地址。

 

 

 

当我们改变第一个例子中的var1的赋值时,var1地址变化,而var2地址保持不变:

3、引用所指判断

 

  我们可以通过is进行引用所指判断,is是用来判断两个引用所指的对象是否相同。

 

整数:

短字符串:

长字符串,注意长字符串就开始不同了:

列表,即使是空列表和含有相同元素的列表都指向不同的对象:

 

由这些比较结果可知:

 

  1、Python缓存了整数和短字符串,因此每个对象在内存中只存有一份,引用所指对象就是相同的,即使使用赋值语句,也只是创造新的引用,而不是对象本身;

 

  2、Python没有缓存长字符串、列表及其他对象,可以有多个值相同的对象,可以使用赋值语句创建出新的对象。

 


 

二、引用计数

  在Python中,每个对象都有指向该对象的引用总数---称为“引用计数”。

 

  查看对象的引用计数:sys.getrefcount()

 

1、普通引用

 

我们可以通过getrefcount来查询对象的引用计数。注意,当使用某个引用作为参数,传递给getrefcount()时,参数实际上创建了一个临时的引用。因此,getrefcount()所得到的结果,总会比期望的多1。

2、容器对象

 

  Python的一个容器对象(比如:表、词典等),可以包含多个对象。实际上,容器对象中包含的并不是元素对象本身,是指向各个元素对象的引用。

 

3、引用计数增加

 

  1、对象被创建

 

2、用已有对象创建新的对象

 

 3、作为容器对象的一个元素

 

4、被作为参数传递给函数:foo(x)


 

4、引用计数减少

 

1、对象的别名被显式的销毁

 

 

2、对象的一个别名被赋值给其他对象

 

 

 

3、对象从一个窗口对象中移除,或,窗口对象本身被销毁

 

4、一个本地引用离开了它的作用域,比如上面的foo(x)函数结束时,x指向的对象引用减1。


三、垃圾回收

  当Python中的对象越来越多,占据越来越大的内存,系统会启动垃圾回收(garbage collection),将没用的对象清除。

 

1、原理

  当Python的某个对象的引用计数降为0时,说明没有任何引用指向该对象,该对象就成为要被回收的垃圾。比如某个新建对象,被分配给某个引用,对象的引用计数变为1。如果引用被删除,对象的引用计数为0,那么该对象就可以被垃圾回收。

 

2、解析del

  del a后,已经没有任何引用指向之前建立的[321,123],该表引用计数变为0,用户不可能通过任何方式接触或者动用这个对象,当垃圾回收启动时,Python扫描到这个引用计数为0的对象,就将它所占据的内存清空。

 

3、注意

  1、垃圾回收时,Python不能进行其它的任务,频繁的垃圾回收将大大降低Python的工作效率;

 

  2、Python只会在特定条件下,自动启动垃圾回收(垃圾对象少就没必要回收)

 

  3、当Python运行时,会记录其中分配对象(object allocation)和取消分配对象(object deallocation)的次数。当两者的差值高于某个阈值时,垃圾回收才会启动。

 

阈值分析:

  700即是系统垃圾回收启动的阈值;

  每10次0代垃圾回收,会配合1次1代的垃圾回收;而每10次1代的垃圾回收,才会有1次的2代垃圾回收;

当然也是可以手动启动垃圾回收:

4、何为分代回收

  Python将所有的对象分为0,1,2三代;

  所有的新建对象都是0代对象;

  当某一代对象经历过垃圾回收,依然存活,就被归入下一代对象。

 


四、内存池机制

 

 

  Python的内存池分为大内存和小内存:(256K为界限分大小内存)

 

1、大内存使用malloc进行分配

 

2、小内存使用内存池进行分配

 

3、Python的内存池(金字塔)

 

  第3层:最上层,用户对Python对象的直接操作

 

  第1层和第2层:内存池,有Python的接口函数PyMem_Malloc实现-----若请求分配的内存在1~256字节之间就使用内存池管理系统进行分配,调用malloc函数分配内存,但是每次只会分配一块大小为256K的大块内存,不会调用free函数释放内存,将该内存块留在内存池中以便下次使用。

 

  第0层:大内存-----若请求分配的内存大于256K,malloc函数分配内存,free函数释放内存。

 

  第-1,-2层:操作系统进行操作

我们可以使用的性能改进手段包括:

 

1.手动垃圾回收


2.避免循环引用(手动解循环引用和使用弱引用)

 

3.调高垃圾回收阈值

 

— — — — — — E N D — — — — — —

 

真格量化可访问:

https://quant.pobo.net.cn

真格量化微信公众号,长按关注:

遇到了技术问题?欢迎加入真格量化Python技术交流QQ群  726895887

 


 

往期文章:

Numpy处理tick级别数据技巧

真正赚钱的期权策略曲线是这样的

多品种历史波动率计算

如何实现全市场自动盯盘

AI是怎样看懂研报的

真格量化策略debug秘籍

真格量化对接实盘交易

常见高频交易策略简介

如何用撤单函数改进套利成交

Deque提高处理队列效率

策略编程选Python还是C++

如何用Python继承机制节约代码量

十大机器学习算法

如何调用策略附件数据

如何使用智能单

如何扫描全市场跨月价差

如何筛选策略最适合的品种

活用订单类型规避频繁撤单风险

真格量化回测撮合机制简介

如何调用外部数据

如何处理回测与实盘差别

如何利用趋势必然终结获利

常见量化策略介绍

期权交易“七宗罪”

波动率交易介绍

推高波动率的因素

波动率的预测之道

趋势交易面临挑战

如何构建知识图谱

机器学习就是现代统计学

AI技术在金融行业的应用

如何避免模型过拟合

低延迟交易介绍

架构设计中的编程范式

交易所视角下的套利指令撮合

距离概念与特征识别

气象风险与天气衍生品

设计量化策略的七个“大坑”

云计算在金融行业的应用

机器学习模型评估方法

真格量化制作期权HV-IV价差

另类数据介绍

TensorFlow中的Tensor是什么?

机器学习的经验之谈

用yfinance调用雅虎财经数据

容器技术如何改进交易系统

Python调用C++

如何选择数据库代理

统计套利揭秘

一个Call搅动市场?让我们温习一下波动率策略

如何用真格量化设计持仓排名跟踪策略

还不理解真格量化API设计?我们不妨参考一下CTP平台

理解同步、异步、阻塞与非阻塞

隐波相关系数和偏度——高维风险的守望者

Delta中性还不够?——看看如何设计Gamma中性期权策略

Python的多线程和多进程——从一个爬虫任务谈起

线程与进程的区别
皮尔逊相关系数与历史K线匹配

Python2和Python3的兼容写法
Python代码优化技巧

理解Python的上下文管理器

如何写出更好的Python代码?这是Python软件基金会的建议

评估程序化模型时我们容易忽视的指标

看看如何定位Python程序性能瓶颈

什么是Python的GIL

投资研究中的大数据分析趋势及应用

理解CTP中的回调函数

如何围绕隐含波动率设计期权交易策略                    

看看如何用Python进行英文文本的情感分析

算法交易的分类

Python编码的最佳实践总结

什么是波动率锥?如何用波动率锥设计期权策略?

期权的波动率策略与时间价值收集策略对比

期权用于套期保值和无风险套利

隐含波动率对期权策略的影响

卖出期权交易的风险管理原则和技巧

期权交易中的“大头针”风险

期权做市商策略简介

精细化您的交易——交易成本评估与交易执行策略

海外市场交易执行策略的实践

设计期权套期保值方案时应注意的问题

美式期权、欧式期权比较分析——定价与风险管理

构建您的AI时代武器库——常用的机器学习相关Python库

期权波动率“微笑曲线”之谜

运算任务愈发繁重,如何加速Python程序运行?

证券市场微观结构理论模型是什么

是瞬间成交还是漫长等待?——如何衡量市场流动性

波动率指数及其衍生品介绍

Python的异常处理技巧

Python中的阻塞、异步与协程

"香草"之外的更多选择——几种常见的路径依赖奇异期权

什么是CTP?——了解上期所CTP快速交易系统

了解季节性——以谷物和油籽为例

是前因还是后果?——在真格量化中进行格兰杰因果检验

Python导入模块的技巧

Python程序员常犯的十个错误

搜索数据泄露天机?——舆情指数与期货行情关联性分析思路

机器学习常见算法分类汇总

如何使用Data Pipeline 自动化数据处理工作?

CTP API的委托介绍和在真格量化中的订单流控制

高频交易对市场的影响

期货行情及其组织形式——以上期所为例

理解并行与并发

郑商所和大商所套利指令及在真格量化的实现

机器学习用于金融市场预测面临的挑战

高频交易中风险控制的常用措施

查询结果偏离预期?来了解CTP的报单函数及委托状态查询

Python中的ftplib模块

理解真格量化的Python编程范式

需要处理大量市场数据?来了解一下MySQL、HBase、ES的特点和应用场景

NumPy中的ndarray与Pandas的Series和DataFrame之间的区别与转换

Python中的scikit-learn机器学习功能库

什么是程序设计中的高内聚、低耦合?

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值