当前位置: 首页 > news >正文

贵阳官方网站网站建设制作设计珠海

贵阳官方网站,网站建设制作设计珠海,centos 网站开发工具,网站建设经费保障大家好,当项目变得越来越大时,有效地管理计算资源是一个不可避免的需求。Python与C或c等低级语言相比,似乎不够节省内存。 但是其实有许多方法可以显著优化Python程序的内存使用,这些方法可能在实际应用中并没有人注意&#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), dtype=np.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], filename='sample-graph.png')### Check memory for pandas.DataFramefrom sklearn.datasets import load_bostondata = load_boston()data = pd.DataFrame(data['data'])print(data.info(verbose=False, memory_usage='deep'))<class 'pandas.core.frame.DataFrame'>RangeIndex: 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(deep=True)   # deep=True 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 Engineer'print(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 Engineer'print(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 don't 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 0x104a57e40>print(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', "r+b") 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.yayakq.cn/news/923696/

相关文章:

  • html商业网站模板toxue外贸网
  • 网站图片像素多少武侯区旅游网站建设
  • 做算命类网站违法吗做网站 证书 浏览器
  • 有没有做牛羊角的网站网站备案要几天
  • 最佳商城ui网站设计免费网站你懂我意思正能量软件
  • 彭州建设网站现在网站建设的技术
  • 江苏商城网站制作公司wordpress获取gallery
  • 免费个人网站注册方法学ps有用还是网页制作
  • 设计用哪些网站有哪些深汕特别合作区房价
  • 做药物分析常用网站企业解决方案展示平台
  • 东莞网站包年优化宜昌市夷陵区建设局网站
  • 手机网站制作行业排行湖北交投建设集团网站
  • 网站怎么使用模板代理网络app
  • 做网站怎么和广告公司合作网站建设亿玛酷神奇5
  • 网站系统php源码药监局网站建设方案
  • 网站项目建设主要内容科学小制作 小发明 简单 手工
  • 企业网站展示生产的处方药介绍处罚案件青岛移动网站开发
  • 无锡宏腾网站建设吉林市网站建设优化
  • 碧江网站建设电商网站开发脑图
  • 购物网站国外网站建设在哪里推广
  • 开设网站步骤营销网站建设费用
  • 重庆做公司网站某网站栏目策划
  • 大气的网站源码wordpress 使用 相对路径
  • 51网站空间相册在哪里网件路由器为什么都是官翻
  • 用mcu做灯光效果网站wordpress主页404
  • 新网站 seo网站怎么样做采集别人网站的文章
  • 万网做网站怎么样用户登录页面html代码
  • 建设银行官方网站面试详细信息曲阳做网站
  • 称心的赣州网站建设深圳搜豹网站建设公司
  • 企业网站建设任务书wordpress entware