2010-04-29 71 views
2

据我所知,在Python的字符串是一个简单的表达,并通过本身将被垃圾立即收集在控制代码的调用者的返回一个字符串,但......在 Python - 做大doc字符串浪费内存?

  1. 大班/方法文档字符串你的代码:他们浪费内存 通过建立字符串对象?
  2. 模块级文档字符串:他们 由解释器无限存储?

这是否甚至重要?我唯一担心的是,如果我使用像Django这样的大型框架或多个大型开放源代码库,它们往往会有很好的文档记录,并且可能有数兆字节的文本。在这些情况下,文档字符串是否被加载到内存中用于沿途使用的代码,然后保存在那里,还是像普通字符串一样立即收集?

+2

相关:http://stackoverflow.com/questions/2731022/do-comments-slow-down-an-interpreted-language – 2010-04-29 16:17:30

+2

可能的重复http://stackoverflow.com/questions/1983177/do-python- docstrings-and-comments-are-stored-in-memory-when-module-is-loaded – 2010-04-29 16:17:57

回答

9
  • “据我所知,在Python的字符串是一个简单的表达,并通过本身将被垃圾立即收集在控制代码的调用者的返回一个字符串”表示一种误解,我想。一个文档字符串被评估一次(不是每个函数调用)并且至少和函数一样保持活跃状态​​。

  • “这是否甚至重要?”说到优化,并不是通过抽象地思考而是通过测量来回答的。在内存密集型应用程序中,“多兆字节”的文本可能并不是很多。节省内存的解决方案可能会在别处生活,您可以通过测量来确定是否属于这种情况。

  • Python的-OO命令行开关删除文档字符串。

+0

@Mike谢谢。 +1 – orokusaki 2010-04-29 18:21:30

2

默认情况下,Python docstrings被无限期地保留下来,因为它们可以通过函数或模块的__doc__属性访问。例如,在test.py如下:

"""This is a test module.""" 

def f(): 
    """This is a test function.""" 
    pass 

然后:

$ python 
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import test 
>>> test.__doc__ 
'This is a test module.' 
>>> test.f.__doc__ 
'This is a test function.' 
>>> 

-OO选项来解释显然是导致它从产生.pyo文件中删除文档字符串,但它不有效果我希望:

$ python -OO 
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import test 
>>> test.__file__ 
'/tmp/test.py' 
>>> 
$ grep "This is a test" /tmp/test.pyo 
Binary file /tmp/test.pyo matches 
$ python -OO 
Python 2.5.1 (r251:54863, Oct 30 2007, 13:54:11) 
[GCC 4.1.2 20070925 (Red Hat 4.1.2-33)] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import test 
>>> test.__file__ 
'/tmp/test.pyo' 
>>> test.__doc__ 
'This is a test module.' 
>>> 

而事实上,与-OO产生的test.pyo文件identi cal到不带命令行参数生成的test.pyc文件。谁能解释这种行为?

+3

乍一看,我会说这是你的Python 2.5.1中的一个bug。它在我在这里的2.5.5上按预期工作。根据NEWS文件,Python 2.5.1c1有这个bug,但它应该在实际的2.5.1版本中得到修复。请参阅http://bugs.python.org/issue1722485 – 2010-04-29 16:57:12