BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #23972同步于 2019/5/23
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

使用 memory_profiler 测内存开销的一个小问题

MasamiFans
2019/5/23镜像同步7 回复
今天看了[一篇文章](https://www.cnblogs.com/devilmaycry812839668/p/7681731.html)提到了 memory_profiler 这个模块,我就自己测试了下 http://ww1.sinaimg.cn/large/c9984d14ly1g3b22f0r4kj20l00643yl.jpg 但是结果跟预想的不一样,按道理说第8行应该增加了内存占用吧,是python优化了吗,还是因为我用了python3。。。小白百思不得其解 附测试代码: ```python import copy import sys @profile def fun(): a=[1,2,3,4,5,6,7,8,9,0] b=a b=a[1:-1] if __name__=="__main__": fun() ``` 运行: ```Shell $python -m memory_profiler run.py ```
订阅后,新回复会通过你的通知中心匿名送达。
7 条回复
specops机器人#1 · 2019/5/23
list是引用赋值
MasamiFans机器人#2 · 2019/5/23
第7行是,但是第8行 list slice 操作应该是创建新空间吧 【 在 specops 的大作中提到: 】 : list是引用赋值
specops机器人#3 · 2019/5/23
b=a[1:-1]? 切片也是引用 没有动态内存分配 就像C++的string_view
MasamiFans机器人#4 · 2019/5/23
但是为什么 b=a[1:-1] 之后 id(b) 和 id(a) 的值不同了呢,求问,我一直以为值不同了它们就指向两块不同内存了 【 在 specops 的大作中提到: 】 : b=a[1:-1]? : 切片也是引用 没有动态内存分配 就像C++的string_view
specops机器人#5 · 2019/5/23
赋值之后a和b是两个不同的对象 在内存中的位置不同 所以id(a)!=id(b) 但在a和b中指向数据的指针是一样的 相当于重复利用了一块数据 所以不需要分配新的内存 【 在 MasamiFans (【意涵团】MasamiFans) 的大作中提到: 】 : 但是为什么 : b=a[1:-1] : 之后 : ...................
yo1995机器人#6 · 2019/5/23
import sys import copy @profile def fun(upper=100): a = [x for x in range(1, upper)] b = a b = a[1:-1] b[0] = 3 # print(id(a), id(b)) c = copy.copy(b) d = copy.deepcopy(b) if __name__=="__main__": fun(100000) lz可以试试参数分别设定为10,1000,100000的时候的运行结果。 看标题本以为自己懂了,测完以后发现自己好像没懂[ema1][ema12]
lucima机器人#7 · 2019/5/24
切片也是浅拷贝。b = a[1:-1]只会增加一些固定大小的指针吧,内存增量太低了没有被memory_profiler记录下来,我猜,就像你的a赋值那行也没有内存增加一样。