Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >是什么占据了这个循环中的记忆?

是什么占据了这个循环中的记忆?
EN

Stack Overflow用户
提问于 2013-09-02 00:20:33
回答 1查看 4.4K关注 0票数 2

我在玩memory_profiler包(从pip下载),更具体地说,我看通过先创建一个临时列表来循环列表的内存效率,而不是通过“迭代器列表”循环。

这是我不久前遇到的一个问题,我想对我的解决方案进行基准测试。问题是,我需要将列表中的每个元素与同一列表中的下一个元素进行比较,直到所有元素都被“处理”为止。因此,我猜这将是一个O(n^2)解决方案(如果选择了最天真的解决方案,对于list中的每个元素,通过list循环)。

无论如何,下面的三个函数都在做相同的事情(或多或少);在一个列表上循环,这个列表被自己抵消了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import cProfile

@profile
def zips():
    li = range(1,20000000)
    for tup in zip(li,li[1:]):
        pass
    del li

@profile
def izips():
    from itertools import izip
    li = range(1,20000000)
    for tup in izip(li,li[1:]):
        pass
    del li

@profile
def izips2():
    from itertools import izip
    li = range(1,20000000)
    for tup in izip(li,li[1:]):
        del tup
    del li



if __name__ == '__main__':
    zips()
    # izips()
    # izips2()

令人惊讶的部分(对我来说)是内存的使用,首先我运行zip()函数,虽然我认为我确实清理了,但最终我仍然在内存中获得了~1.5GB的内存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ipython -m memory_profiler python_profiling.py 
Filename: python_profiling.py

Line #    Mem usage    Increment   Line Contents
================================================
    10                             @profile
    11    27.730 MB     0.000 MB   def zips():
    12   649.301 MB   621.570 MB    li = range(1,20000000)
    13  3257.605 MB  2608.305 MB    for tup in zip(li,li[1:]):
    14  1702.504 MB -1555.102 MB        pass
    15  1549.914 MB  -152.590 MB    del li

然后关闭解释器实例并重新打开它以运行下一个测试,即izips()函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ipython -m memory_profiler python_profiling.py 
Filename: python_profiling.py

Line #    Mem usage    Increment   Line Contents
================================================
    17                             @profile
    18    27.449 MB     0.000 MB   def izips():
    19    27.449 MB     0.000 MB    from itertools import izip
    20   649.051 MB   621.602 MB    li = range(1,20000000)
    21  1899.512 MB  1250.461 MB    for tup in izip(li,li[1:]):
    22  1746.922 MB  -152.590 MB        pass
    23  1594.332 MB  -152.590 MB    del li

最后,我运行了一个测试(在中间重新启动解释器之后),我试图显式删除for-循环中的元组,以确保它的内存被释放(也许我没有正确地考虑)。事实证明,这并没有什么不同,所以我猜测,要么我没有提示GC,要么这不是我内存开销的来源。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ipython -m memory_profiler python_profiling.py 
Filename: python_profiling.py

Line #    Mem usage    Increment   Line Contents
================================================
    25                             @profile
    26    20.109 MB     0.000 MB   def izips2():
    27    20.109 MB     0.000 MB    from itertools import izip
    28   641.676 MB   621.566 MB    li = range(1,20000000)
    29  1816.953 MB  1175.277 MB    for tup in izip(li,li[1:]):
    30  1664.387 MB  -152.566 MB        del tup
    31  1511.797 MB  -152.590 MB    del li

底线:我认为for循环本身的开销是最小的,因此,我期望的是略多于620.000 MB (存储列表所需的内存),但是看起来我的内存中有两个大小为20.000.000的列表+更多的开销。有人能帮我解释一下这些内存是用来做什么的吗?(在每次运行结束时,这个~1.5GB的容量是多少?)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-02 00:39:53

请注意,操作系统以块的形式分配内存,而不一定一次收回所有内存。我发现内存分析包非常不准确,因为它似乎没有考虑到这一点。

您的li[1:]片创建了一个包含(2*10**7) -1元素的新列表,几乎是一个全新的副本,可以轻松地加倍列表所需的内存空间。zip()调用还返回一个完整的新list对象,即压缩操作的输出,再次需要中间结果的内存,加上2000万个元素元组。

您可以使用一个新的迭代器而不是切片:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def zips():
    from itertools import izip
    li = range(1,20000000)
    next_li = iter(li)
    next(next_li)  # advance one step
    for tup in izip(li, next_li):
        pass
    del li

iter()调用返回的列表迭代器的重量要轻得多;它只保留对原始列表和指针的引用。将此与izip()相结合也可以避免创建输出列表。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18568564

复制
相关文章
Python是构建企业项目的一个好选择吗?
如果你看我博客很长一段时间了,你应该知道我已经做了十多年的Python,甚至写了两本关于它的书。因此,虽然我显然有偏见,在写回复之前,我还想退后一步,并向您保证,亲爱的读者,我在过去20年中使用了许多其他编程语言:Perl,C,PHP ,Lua,Lisp,Java等。我用其中一些构建了很小的大型项目,我认为Lisp是最好的编程语言。因此,我觉得我并不过分偏袒。
后场技术
2020/09/03
4260
Python是构建企业项目的一个好选择吗?
CTF| 这是一个刚挖好的洞······
背景 近期在研究学习变量覆盖漏洞的问题,于是就把之前学习的和近期看到的CTF题目中有关变量覆盖的题目结合下进一步研究。 通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞。经常导致变量覆盖漏洞场景有:$$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册等。 本篇收集了几个CTF中的题目作为例子,对$$,extract(),parse_str()的问题进行总结。 $$导致的变量覆盖
漏斗社区
2018/03/28
1.9K0
CTF| 这是一个刚挖好的洞······
去欧洲,是医疗AI公司的好选择吗?
医疗AI的商业化一直是行业内人士热衷谈论的话题。虽然想象空间十分巨大,但就以国内的审批标准而言,多数医疗AI企业还尚未满足拿证的条件。与此同时,我们也可以到看到一些企业,在欧洲这一“海外战场”积蓄多年,并且真正地取得了一些实质性突破。
AI掘金志
2020/03/30
9650
怎样选择一个好的虚拟主机
SSL 是一个安全协议,它提供使用 TCP/IP 的通信应用程序间的隐私与完整性。因特网的 超文本传输协议(HTTP)使用 SSL 来实现安全的通信。
全栈程序员站长
2021/09/26
2K0
怎样选择一个好的虚拟主机
你有一个好的归档习惯吗?
备忘和扯一扯最近散仙在工作用到的几个不错的小技术点: (1)使用shell写了一个根据年份能生成此年份下归档文件目录,精确到年-月-日-小时 谈谈本意: 由于散仙最近是在搞我们平台的搜索日志分析的工作,日志记录的数据是存在我们的Hadoop集群的HDFS上,日志记录的形式,自然也是按照年月日小时这样一个目录存储的,至于为啥这么设计,通过时间维度来准确归档: 好处: 这样在分析数据时,便能任意指定时间范围来分析,最细精确到小时上,最大可按年统计,所以,例如最近1小时,3小时,最近7天,最近一个月,
我是攻城师
2018/05/11
8870
这是一个众人裸奔的时代,你害怕吗!!!
生活在科技如此发达的今天,互联网上我们已经没有任何秘密可言。说这是一个「众人裸奔」的时代,其实一点也不过分。不错,皇帝的新衣,说的就是你,重点不在于你是皇帝,而在于「新衣」。不要以为别人说你没穿衣服,你不信,非得像我这么「纯真的小孩」说你在裸奔,你才相信。 Facebook 事件刚刚落下帷幕,Twitter 又搅和进来了。大数据的兴起,云服务的枝繁叶茂,云端数据的计算,让如今这个时代网络安全显的更为重要。 一、 昨天,Twitter 在其官方博客上表示,他们在应用内部发现了新的密码漏洞,“出于谨慎考虑”,建
非著名程序员
2018/07/19
6920
如何选择域名?一个好的域名有哪些原则?
现在是一个互联网经济开放的时代,那么值得说的是互联网基础是什么呢?是提供各种网站来满足各个年龄、文化、教育、习惯等客户群,这就给了许多企业赚钱的机会,只要能细分客户群市场,就可以赚到钱,许多企业于是开始建网站,却忽略了域名的重视,那么接下来请跟随小编一起来看如何选择域名?一个好的域名有哪些原则?从细节上提升网站的影响力。
用户8739990
2021/08/06
2.9K0
如何选择域名?一个好的域名有哪些原则?
一个好的技术团队应该怎么选择开发语言
在过去的三年时间了,作为曾经的研发部经理,我和我的技术总监始终在为一件事而努力着,那就是选择一门合适我们团队的技术语言。 我们研发团队一共有9个人,分为三个小组:移动手机组、后端接口组、web前端组,如果按照大公司的做法,我们完全不必为每组应该选择什么技术语言而担心,我们可以在每组中选择一个组长,由他全权负责即可,公司层面只要最终的结果即可,可事情并没有那么简单。 现实总是残酷的,其中的原因有这么几个:第一:岗位经费不高,想要低成本找一个技术合格的人非常难;第二:知名度有限,一般的技术人才都有更好选择的条件
磊哥
2018/07/04
7370
怎样选择一个好的SaaS知识库工具?
知识库软件将帮助您和您的团队创建和管理您的知识库。这包括设置知识库架构、创建和编辑文章以及搜索和分析您的知识库。
用户9912463
2022/08/09
2520
这是EnterLib PIAB的BUG吗?
在默认的情况下,EnterLib的PIAB采用基于TransparentProxy/RealProxy的机制实现对方法调用的拦截,进而实现了对横切关注点(Crosscutting Concern)的动态注入。也正是其来截机制本身的局限,当我们才用PIAB的方式进行对象的创建的时候,要求本创建对象的类型要么实现某一个接口,要么继承MarshalByRefObject类型。但是当我们让抽象基类继承自MarshalByRefObject就不行了,我个人觉得这是微软需要改进的地方。 一、基于接口实现和对Marsha
蒋金楠
2018/01/16
5540
这是EnterLib PIAB的BUG吗?
一个好的技术团队应该怎么选择开发语言
在过去的三年时间了,作为曾经的研发部经理,我和我的技术总监始终在为一件事而努力着,那就是选择一门合适我们团队的技术语言。 我们研发团队一共有9个人,分为三个小组:移动手机组、后端接口组、web前端组,如果按照大公司的做法,我们完全不必为每组应该选择什么技术语言而担心,我们可以在每组中选择一个组长,由他全权负责即可,公司层面只要最终的结果即可,可事情并没有那么简单。 现实总是残酷的,其中的原因有这么几个:第一:岗位经费不高,想要低成本找一个技术合格的人非常难;第二:知名度有限,一般的技术人才都有更好选择的条件
磊哥
2018/05/08
7530
如何设计一个好的测试用例?
“好的”测试用例一定是一个完备的集合,它能够覆盖所有等价类以及各种边界值,而跟能否发现缺陷无关。
孟船长
2019/12/17
1.2K0
如何写出一个好的设计文档?
大部分的工程师都不重视设计文档的书写,对于一个需求,都是经过一些简单的讨论,写一个简单的方案甚至就是自己简单的想想就开始进行编码的工作。
一个会写诗的程序员
2019/07/18
2.3K0
cad看图软件哪个好?如何选择好的软件
CAD对于很多人来说应该是不陌生的,因为进行平面设计等行业的人基本都会用到CAD,而且在如今这个“技多不压身”的时代,学习CAD已经是大多数人的学习日常,毕竟它的运用领域还是非常广泛的。尤其是如今CAD也有了相信的认证考试,考试门槛并不高,所以越来越多的人都想要学习CAD。和CAD无法分割的就是cad看图软件,通过cad看图软件才能够将整个图完整呈现出来,那么cad看图软件哪个好呢?
用户8715145
2021/06/17
12.8K0
这是你了解的 print()函数吗
print() 应该是初学者最先接触到的第一个 Python 函数,因为几乎所有的启蒙课程都是从 print(‘Hello world’) 开始的。事实上, print() 也是程序员使用频率最高的函数之一,同时也是很多程序员喜欢的代码调试利器。但是关于 print() 函数,你真的了解吗?
IT茂茂
2020/03/05
5700
这是你了解的 print()函数吗
网站建设哪家好公司好?应该如何选择?
随着市场经济的发展,很多工作划分的越来越细,专业性也越来越高,现在很多企业都喜欢将部分工作外包给专业的公司负责,一方面可以帮助企业节省成本,另一方面,专业的人做专业的事,效果更好。比如企业网站建设,现在企业一般都会选择专业的网站搭建公司帮助建设企业网站,市面上也有很多各种各样的网站建设公司,但是网站建设哪家好公司好呢?很多人并不会挑选。
用户8715145
2021/11/03
7.6K0
Django小技巧22: 设计一个好的模型
本篇将分享一些技巧,用户改进 Model 的设计。其中有很多与命名约定有关, 这可以大大的提高代码的可读性。
用户1416054
2018/12/07
8990
高内聚与低耦合_低内聚高耦合是一个好设计的特征吗
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说高内聚与低耦合_低内聚高耦合是一个好设计的特征吗,希望能够帮助大家进步!!!
Java架构师必看
2022/09/12
9180
高内聚与低耦合_低内聚高耦合是一个好设计的特征吗
好的界面设计
1.尽量使用单列而不是多列布局 单列布局能够让对全局有更好的掌控。同时用户也可以一目了然内容。而多列而已则会有分散用户注意力的风险使你的主旨无法很好表达。最好的做法是用一个有逻辑的叙述来引导用户并且在
前朝楚水
2018/04/02
1.3K0
好的界面设计
来自硅谷的互联网企业是一个好的选择么?
过去的一周多每天戴着耳机,对邮箱里看得上眼的简历电话筛选。作为一个「内向」的,不那么喜欢电话沟通的人,我从未这么集中地打过电话 —— 我的舌肌和咬肌得到了前所未有地锻炼,仿佛这辈子要煲的电话粥,说的情话,都得在短短几日里完成。 很多招聘者对待面试是一个居高临下的态度,仿佛一份工作机会是一份给予,是施舍,是「有个工作就不错了你还那么矫情究竟想怎样爱来来不来滚」(这是我在公司所在的众创空间亲耳听到的某个团队的对话)。我(以及我呆过的主要公司:tubitv,途客圈,Juniper)对此都持完全相反的态度。公司和
tyrchen
2018/03/29
9630

相似问题

用于google ajax搜索的grails url映射

10

url_for()在ajax中调用静态文件

24

KML Google不会处理URL中的空白

11

带有空白"url“的jQuery中的AJAX

12

使用MapView时的空白映射

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文