网站排名优化提升快速,网站开发研究背景,唐山网站建设策划方案,为什么做网站结构优化大家好#xff0c;当项目变得越来越大时#xff0c;有效地管理计算资源是一个不可避免的需求。Python与C或c等低级语言相比#xff0c;似乎不够节省内存。
但是其实有许多方法可以显著优化Python程序的内存使用#xff0c;这些方法可能在实际应用中并没有人注意#xff0…大家好当项目变得越来越大时有效地管理计算资源是一个不可避免的需求。Python与C或c等低级语言相比似乎不够节省内存。
但是其实有许多方法可以显著优化Python程序的内存使用这些方法可能在实际应用中并没有人注意所以本文将重点介绍Python的内置机制掌握它们将大大提高Python编程技能。
首先在进行内存优化之前我们首先要查看内存的使用情况。
有几种方法可以在Python中获取对象的大小可以使用sys.getsizeof()来获取对象的确切大小使用objgraph.show_refs()来可视化对象的结构或者使用psutil.Process().memory_info()。RSS获取当前分配的所有内存。
import numpy as np
import sys
import objgraph
import psutil
import pandas as pdob np.ones((1024, 1024, 1024, 3), dtypenp.uint8)### Check object ob sizesys.getsizeof(ob) / (1024 * 1024)3072.0001373291016### Check current memory usage of whole process (include ob and installed packages, ...)psutil.Process().memory_info().rss / (1024 * 1024)3234.19140625### Check structure of ob (Useful for class object)objgraph.show_refs([ob], filenamesample-graph.png)### Check memory for pandas.DataFramefrom sklearn.datasets import load_bostondata load_boston()data pd.DataFrame(data[data])print(data.info(verboseFalse, memory_usagedeep))class pandas.core.frame.DataFrameRangeIndex: 506 entries, 0 to 505Columns: 13 entries, 0 to 12dtypes: float64(13)memory usage: 51.5 KB### Check memory for pandas.Seriesdata[0].memory_usage(deepTrue) # deepTrue to include all the memory used by underlying parts that construct the pd.Series4176
1. __slots__
Python作为一种动态类型语言在面向对象方面具有更大的灵活性。在运行时可以向Python类添加额外属性和方法的能力。
例如下面的代码定义了一个名为Author的类。最初它有两个属性name和age。但是可以很容易地添加一个额外的job: class Author:def __init__(self, name, age):self.name nameself.age ageme Author(Yang Zhou, 30)me.job Software Engineerprint(me.job)# Software Engineer
但是这种灵活性在底层浪费了更多内存。
因为Python中每个类的实例都维护一个特殊的字典(__dict__)来存储实例变量。因为字典的底层基于哈希表的实现所以消耗了大量的内存。
在大多数情况下我们不需要在运行时更改实例的变量或方法并且__dict__不会也不应该在类定义后更改。所以Python为此提供了一个属性:__slots__。
它通过指定类的所有有效属性的名称来作为白名单: class Author:__slots__ (name, age)def __init__(self, name, age):self.name nameself.age ageme Author(Yang Zhou, 30)me.job Software Engineerprint(me.job)# AttributeError: Author object has no attribute job
白名单只定义了两个有效的属性name和age。由于属性是固定的Python不需要为它维护字典,只为__slots__中定义的属性分配必要的内存空间。
下面我们做一个简单的比较 import sysclass Author:def __init__(self, name, age):self.name nameself.age ageclass AuthorWithSlots:__slots__ [name, age]def __init__(self, name, age):self.name nameself.age age# Creating instancesme Author(Yang, 30)me_with_slots AuthorWithSlots(Yang, 30)# Comparing memory usagememory_without_slots sys.getsizeof(me) sys.getsizeof(me.__dict__)memory_with_slots sys.getsizeof(me_with_slots) # __slots__ classes dont have __dict__print(memory_without_slots, memory_with_slots)# 152 48print(me.__dict__)# {name: Yang, age: 30}print(me_with_slots.__dict__)# AttributeError: AuthorWithSlots object has no attribute __dict__
可以看到 152 和 48 明显节省了内存。
2. Generators
生成器是Python中列表的惰性求值版本。每当调用next()方法时生成一个项而不是一次计算所有项。所以它们在处理大型数据集时非常节省内存。 def number_generator():for i in range(100):yield inumbers number_generator()print(numbers)# generator object number_generator at 0x104a57e40print(next(numbers))# 0print(next(numbers))# 1
上面的代码显示了一个编写和使用生成器的基本示例。关键字yield是生成器定义的核心。应用它意味着只有在调用next()方法时才会产生项i。
让我们比较一个生成器和一个列表看看哪个更节省内存: mport sysnumbers []for i in range(100):numbers.append(i)def number_generator():for i in range(100):yield inumbers_generator number_generator()print(sys.getsizeof(numbers_generator))# 112print(sys.getsizeof(numbers))# 920
可以看到使用生成器可以显著节省内存使用。如果我们将列表推导式的方括号转换成圆括号它将成为生成器表达式。这是在Python中定义生成器的更简单的方法:
import sysnumbers [i for i in range(100)]numbers_generator (i for i in range(100))print(sys.getsizeof(numbers_generator))# 112print(sys.getsizeof(numbers))# 920
3. 利用内存映射文件支持大文件处理
内存映射文件I/O简称“mmap”是一种操作系统级优化。
简单地说当使用mmap技术对文件进行内存映射时它直接在当前进程的虚拟内存空间中创建文件的映射而不是将整个文件加载到内存中这节省了大量内存。
Python已经提供了用于使用此技术的内置模块因此我们可以轻松地利用它而无需考虑操作系统级别的实现。
以下是如何在Python中使用mmap进行文件处理: import mmapwith open(test.txt, rb) as f:# memory-map the file, size 0 means whole filewith mmap.mmap(f.fileno(), 0) as mm:# read content via standard file methodsprint(mm.read())# read content via slice notationsnippet mm[0:10]print(snippet.decode(utf-8))
Python使内存映射文件I/O技术的使用变得方便。所需要做的只是应用mmap.mmap()方法然后使用标准文件方法甚至切片符号处理打开的对象。
4. 选择适当的数据类型
开发人员应仔细而精确地选择数据类型。因为在某些情况下使用一种数据类型比使用另一种数据类型更节省内存。
元组比列表更节省内存
元组是不可变的(在创建后不能更改)它允许Python在内存分配方面进行优化。列表是可变的因此需要额外的空间来容纳潜在的修改。 import sysmy_tuple (1, 2, 3, 4, 5)my_list [1, 2, 3, 4, 5]print(sys.getsizeof(my_tuple))# 80print(sys.getsizeof(my_list))# 120
元组my_tuple比列表使用更少的内存如果创建后不需要更改数据我们应该选择元组而不是列表。
数组比列表更节省内存
Python中的数组要求元素具有相同的数据类型(例如所有整数或所有浮点数)但列表可以存储不同类型的对象这不可避免地需要更多的内存。如果列表的元素都是相同类型使用数组会更节省内存: import sysimport arraymy_list [i for i in range(1000)]my_array array.array(i, [i for i in range(1000)])print(sys.getsizeof(my_list)) # 8856print(sys.getsizeof(my_array))# 4064
另外Python是数据科学的主导语言。有许多强大的第三方模块和工具提供更多的数据类型如NumPy和Pandas。如果我们只需要一个简单的一维数字数组而不需要NumPy提供的广泛功能那么Python的内置数组是一个不错的选择。但当涉及到复杂的矩阵操作时使用NumPy提供的数组是所有数据科学家的首选也可能是最佳选择。
5. 字符串驻留
看看下面的代码 a Y*4096 b Y*4096 a is bTrue c Y*4097 d Y*4097 c is dFalse
为什么a是b是真而c是d是假呢?
这在Python中被称作字符串驻留string interning.如果有几个值相同的小字符串它们将被Python隐式地存储并在内存中并引用相同的对象。定义小字符串阈值数字是4096。
由于c和d的长度为4097因此它们是内存中的两个对象而不是一个对象不再隐式驻留字符串。所以当执行c d时我们得到一个False。
驻留是一种优化内存使用的强大技术。如果我们想要显式地使用它可以使用sys.intern()方法: a Y*4096 b Y*4096 a is bTrue c Y*4097 d Y*4097 c is dFalse
文章转载自: http://www.morning.srckl.cn.gov.cn.srckl.cn http://www.morning.kjgrg.cn.gov.cn.kjgrg.cn http://www.morning.kjgrg.cn.gov.cn.kjgrg.cn http://www.morning.mltsc.cn.gov.cn.mltsc.cn http://www.morning.mprtj.cn.gov.cn.mprtj.cn http://www.morning.rglzy.cn.gov.cn.rglzy.cn http://www.morning.rqxtb.cn.gov.cn.rqxtb.cn http://www.morning.zyytn.cn.gov.cn.zyytn.cn http://www.morning.fkgcd.cn.gov.cn.fkgcd.cn http://www.morning.gmnmh.cn.gov.cn.gmnmh.cn http://www.morning.ysrtj.cn.gov.cn.ysrtj.cn http://www.morning.tfbpz.cn.gov.cn.tfbpz.cn http://www.morning.ndngj.cn.gov.cn.ndngj.cn http://www.morning.tfwg.cn.gov.cn.tfwg.cn http://www.morning.qjbxt.cn.gov.cn.qjbxt.cn http://www.morning.qcnk.cn.gov.cn.qcnk.cn http://www.morning.lmdfj.cn.gov.cn.lmdfj.cn http://www.morning.nxbkw.cn.gov.cn.nxbkw.cn http://www.morning.gfprf.cn.gov.cn.gfprf.cn http://www.morning.yprnp.cn.gov.cn.yprnp.cn http://www.morning.zbkwj.cn.gov.cn.zbkwj.cn http://www.morning.xhhzn.cn.gov.cn.xhhzn.cn http://www.morning.hcbky.cn.gov.cn.hcbky.cn http://www.morning.kpyyf.cn.gov.cn.kpyyf.cn http://www.morning.dmldp.cn.gov.cn.dmldp.cn http://www.morning.ssgqc.cn.gov.cn.ssgqc.cn http://www.morning.gmyhq.cn.gov.cn.gmyhq.cn http://www.morning.lyrgp.cn.gov.cn.lyrgp.cn http://www.morning.phlrp.cn.gov.cn.phlrp.cn http://www.morning.ymsdr.cn.gov.cn.ymsdr.cn http://www.morning.clpdm.cn.gov.cn.clpdm.cn http://www.morning.trmpj.cn.gov.cn.trmpj.cn http://www.morning.knsmh.cn.gov.cn.knsmh.cn http://www.morning.qxnlc.cn.gov.cn.qxnlc.cn http://www.morning.gnwse.com.gov.cn.gnwse.com http://www.morning.rwxnn.cn.gov.cn.rwxnn.cn http://www.morning.cxsdl.cn.gov.cn.cxsdl.cn http://www.morning.pwqyd.cn.gov.cn.pwqyd.cn http://www.morning.pyswr.cn.gov.cn.pyswr.cn http://www.morning.mrkbz.cn.gov.cn.mrkbz.cn http://www.morning.zcckq.cn.gov.cn.zcckq.cn http://www.morning.gbljq.cn.gov.cn.gbljq.cn http://www.morning.tgydf.cn.gov.cn.tgydf.cn http://www.morning.lwsct.cn.gov.cn.lwsct.cn http://www.morning.qdbcd.cn.gov.cn.qdbcd.cn http://www.morning.jfch.cn.gov.cn.jfch.cn http://www.morning.pjtw.cn.gov.cn.pjtw.cn http://www.morning.xqcgb.cn.gov.cn.xqcgb.cn http://www.morning.ykgp.cn.gov.cn.ykgp.cn http://www.morning.mjzcp.cn.gov.cn.mjzcp.cn http://www.morning.nuejun.com.gov.cn.nuejun.com http://www.morning.trtdg.cn.gov.cn.trtdg.cn http://www.morning.cldgh.cn.gov.cn.cldgh.cn http://www.morning.zyndj.cn.gov.cn.zyndj.cn http://www.morning.gxwyr.cn.gov.cn.gxwyr.cn http://www.morning.wnnfh.cn.gov.cn.wnnfh.cn http://www.morning.crsnb.cn.gov.cn.crsnb.cn http://www.morning.jwcmq.cn.gov.cn.jwcmq.cn http://www.morning.ngcsh.cn.gov.cn.ngcsh.cn http://www.morning.hengqilan.cn.gov.cn.hengqilan.cn http://www.morning.qmrsf.cn.gov.cn.qmrsf.cn http://www.morning.kqhlm.cn.gov.cn.kqhlm.cn http://www.morning.mrskk.cn.gov.cn.mrskk.cn http://www.morning.hwzzq.cn.gov.cn.hwzzq.cn http://www.morning.lsjtq.cn.gov.cn.lsjtq.cn http://www.morning.xplng.cn.gov.cn.xplng.cn http://www.morning.btsls.cn.gov.cn.btsls.cn http://www.morning.bhqlj.cn.gov.cn.bhqlj.cn http://www.morning.jyyw.cn.gov.cn.jyyw.cn http://www.morning.hflrz.cn.gov.cn.hflrz.cn http://www.morning.znrgq.cn.gov.cn.znrgq.cn http://www.morning.tkryt.cn.gov.cn.tkryt.cn http://www.morning.hsgxj.cn.gov.cn.hsgxj.cn http://www.morning.ybgpk.cn.gov.cn.ybgpk.cn http://www.morning.lrdzb.cn.gov.cn.lrdzb.cn http://www.morning.wqhlj.cn.gov.cn.wqhlj.cn http://www.morning.dyxzn.cn.gov.cn.dyxzn.cn http://www.morning.supera.com.cn.gov.cn.supera.com.cn http://www.morning.nlrxh.cn.gov.cn.nlrxh.cn http://www.morning.brfxt.cn.gov.cn.brfxt.cn