[求证] python 的注释会占用内存么?

2016-11-09 11:14:03 +08:00
 silva
昨天遇到一个过来给我们普及下 python ,过程中间他提到 python 里的注释会占用更多内存,用三个引号"""阔起来就不会了

我当时感觉这个说法太过匪夷所思,就问是何缘故,可惜他推说不记得了,只说曾经专门给某公司写了个脚本把所有的注释都用"""阔起来,当时就是为了避免空间浪费。

下来之后我自己查找 python 的空间消耗一类的文章,未见有此说法。因此到此地找诸位高手求证
6241 次点击
所在节点    Python
21 条回复
shyling
2016-11-09 11:16:52 +08:00
会啊...__doc__
myyou
2016-11-09 11:18:56 +08:00
应该不占用吧, python 编码为机器码时会忽略注释的内容。
ryanzyy
2016-11-09 11:19:18 +08:00
试试 python -OO
janxin
2016-11-09 11:19:47 +08:00
__doc__应该会,但是你说"""引用起来不会我就不懂了,等大神解释下?
silva
2016-11-09 11:37:25 +08:00
看到有不少同学回复说__doc__的话,会占用,但是__doc__是在诸如函数之后的第一个字符串。并不是用#开始的注释。所以应该不是__doc__的原因吧。

顺便问下我如何才能在顶部补充自己的帖子,而不是回帖额。。。
aias
2016-11-09 11:39:28 +08:00
@silva APPEND
lhbc
2016-11-09 12:46:54 +08:00
1. 不会占用内存
2. 注释占用大量的硬盘空间
3. 注释严重影响载入速度,
coderluan
2016-11-09 13:34:56 +08:00
写了个脚本把所有的注释都用"""阔起来

这句话明确说明了他说的注释应该是__doc__之类的吧,没人会说因为"""占内存,所以再加些"""把他们注释了。
silva
2016-11-09 13:39:40 +08:00
@coderluan __doc__本身就是字符串,用"""括起来也没有啥意思吧

@aias thanks...
9hills
2016-11-09 13:40:26 +08:00
#开头的不会,反倒是函数和类开头的"""包起来的会,因为是__doc__。。。

你说的那位应该是记反了。。。
silva
2016-11-09 13:41:46 +08:00
@lhbc 直觉上我觉得你说的靠谱
silva
2016-11-09 13:50:55 +08:00
@9hills 谢谢,我想应该是这么回事


@ryanzyy 我只看到-O0 选项是“ -O0 Discard docstrings in addition to the -O optimizations.” 没看见-OO 是干啥的呢
wellsc
2016-11-09 14:32:51 +08:00
@silva 会把 .py 编译成 .pyo ,然而没啥用
WKPlus
2016-11-09 15:39:43 +08:00
这个问题蛮有意思,我测试了一下:
1. 被 import 的函数没有注释,没有__doc__,进程启动后 RSS 4396KB
2. 被 import 的函数带有~16MB 左右的注释,没有__doc__,进程启动后 RSS 4396KB
3. 被 import 的函数没有注释,带有~16MB 的__doc__,进程其启动后 RSS 20036KB
4. 被 import 的函数没有注释,没有__doc__,但是内部有一个没有使用到的~16MB 的 str 对象(不管是"""还是"引起来),进程启动后 RSS 20036KB
5. 第四步的基础上,调用一次 gc.collect(),然后再统计进程内存使用,发现 RSS 4400KB


所以我觉得 9hills 的猜测是对的,那位记反了:用"""的方式注释掉一段代码其实只是把它变成一个没有引用的 str 对象,还是占着内存的,#的方式注释才是真正的注释。

不过从第 5 步的测试结果来看,"""方式的注释生成的只是一个没有引用的 str 对象, gc 的时候是可以回收掉的。
pango
2016-11-09 15:44:32 +08:00
@WKPlus 赞认真的态度
silva
2016-11-09 15:51:27 +08:00
@WKPlus 太感谢了,我还正在考虑找个 linux 环境,用进程内存来看大小呢,您就解决了。
看步骤,似乎 python 有自己查看内存大小的功能,但是我直接搜索"python rss",一无所获。能说明下关键词一类的麽,谢谢
dream7758521
2016-11-09 16:17:33 +08:00
上机测试一下不就知道了啊
WKPlus
2016-11-09 16:24:30 +08:00
@silva centos 上,查看 /proc/<pid>/status 文件,里面的 VmRSS 就是进程的物理内存使用量
silva
2016-11-09 17:13:35 +08:00
@WKPlus 哦,谢谢


@dream7758521 我突然想到其实在 win 下也可以用任务管理器看内存…之前老去想找个 linux 环境做试验…是我蠢了
WangYanjie
2016-11-09 21:13:53 +08:00
我觉得,你肯能弄反了, 注释不会, docstring 会。
首先 docstring 不是注释,其次既然你在运行时,是可以获取 docstring 的,那么显然 docstring 没有被忽略。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/319202

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX