请问哪里有Python垃圾回收的详细资料或书籍?

187 views
Skip to first unread message

王恩俊

unread,
Jun 7, 2018, 4:51:01 AM6/7/18
to python-cn(华蟒用户组,CPyUG 邮件列表)
for i in range(100000):
    for j in range(100000):
        pass

python2运行这段代码的进程,所占用的内存为什么是一个固定值?
而且这个值跟两层range的大小线性相关。

是什么原因会造成这种现象?
是range的实现,还是Python的垃圾回收机制
python2的range似乎会直接返回一个list, 应该是会耗内存的

Shell Xu

unread,
Jun 7, 2018, 10:38:36 AM6/7/18
to CUPG
Python源码解析
这个确实应该是固定值啊。
j循环的那个list,始终处于复用中。

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout


--
彼節者有間,而刀刃者無厚;以無厚入有間,恢恢乎其於游刃必有餘地矣。
blog: http://shell909090.org/

王恩俊

unread,
Jun 7, 2018, 11:37:32 AM6/7/18
to python-cn(华蟒用户组,CPyUG 邮件列表)
它为什么会被复用呢?
不是说离开作用域就会被销毁吗?


On Thursday, June 7, 2018 at 10:38:36 PM UTC+8, shell909090 wrote:
Python源码解析
这个确实应该是固定值啊。
j循环的那个list,始终处于复用中。

On Thu, Jun 7, 2018 at 4:51 PM 王恩俊 <aladdi...@gmail.com> wrote:
for i in range(100000):
    for j in range(100000):
        pass

python2运行这段代码的进程,所占用的内存为什么是一个固定值?
而且这个值跟两层range的大小线性相关。

是什么原因会造成这种现象?
是range的实现,还是Python的垃圾回收机制
python2的range似乎会直接返回一个list, 应该是会耗内存的

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com
要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

Boran Guan

unread,
Jun 7, 2018, 12:38:37 PM6/7/18
to pyth...@googlegroups.com
语法层面,离开作用域确实是dealloc,
底层实现是没有真正销毁的,内存只是从新回到了free_list ,下次再创建整形对象时,
这部分内存是会被重新 使用的。

python内存分配层还有内存 池,小块内存dealloc都不是真正的dealloc



chenh...@gmail.com

unread,
Jun 7, 2018, 1:45:16 PM6/7/18
to python-cn(华蟒用户组,CPyUG 邮件列表)
每一次都free了再申请累不累啊……

在 2018年6月7日星期四 UTC+1下午5:38:37,Boa写道:

Reed Xia

unread,
Jun 7, 2018, 9:31:58 PM6/7/18
to pyth...@googlegroups.com
各位早上好,

这两天在用PyMySql模块,想连上MySql后创建一个表,发现具体到代码里,实际写的还是真实的SQL语句,类似于https://pythontic.com/database/mysql/create%20table, 这样的话这不是和纯手写SQL语句没区别吗,而用双引号引用起来就是个字符串,也不能帮忙分析SQL语句的语法或者拼写错误什么的。

又google下,似乎MySql官方推荐的Python方法也是差不多,见https://dev.mysql.com/doc/connector-python/en/connector-python-example-ddl.html

小弟才疏学浅,感觉应该有更好的MySql操作的封装方式,可以不用和使用Sql命令行那样纯手写SQL语句的模块。。。有的话还请各位分享。

谢谢大家!

Yangliang Li

unread,
Jun 7, 2018, 9:44:01 PM6/7/18
to pyth...@googlegroups.com
你需要的是 ORM 吧,看看 SQLAlchemy.

Reed Xia <huaqi...@gmail.com>于2018年6月8日 周五09:31写道:
--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。

Reed Xia

unread,
Jun 7, 2018, 10:15:25 PM6/7/18
to pyth...@googlegroups.com
谢谢!似乎是我要的,我去看看

2018-06-08 9:43 GMT+08:00 Yangliang Li <yangli...@gmail.com>:
你需要的是 ORM 吧,看看 SQLAlchemy.
Reed Xia <huaqi...@gmail.com>于2018年6月8日 周五09:31写道:
各位早上好,

这两天在用PyMySql模块,想连上MySql后创建一个表,发现具体到代码里,实际写的还是真实的SQL语句,类似于https://pythontic.com/database/mysql/create%20table, 这样的话这不是和纯手写SQL语句没区别吗,而用双引号引用起来就是个字符串,也不能帮忙分析SQL语句的语法或者拼写错误什么的。

又google下,似乎MySql官方推荐的Python方法也是差不多,见https://dev.mysql.com/doc/connector-python/en/connector-python-example-ddl.html

小弟才疏学浅,感觉应该有更好的MySql操作的封装方式,可以不用和使用Sql命令行那样纯手写SQL语句的模块。。。有的话还请各位分享。

谢谢大家!

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com
要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。

Shell Xu

unread,
Jun 7, 2018, 11:04:43 PM6/7/18
to CUPG
不free直接用就出事了。。。

它为什么会被复用呢?
不是说离开作用域就会被销毁吗?
Python源码解析
这个确实应该是固定值啊。
j循环的那个list,始终处于复用中。

要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout


--
彼節者有間,而刀刃者無厚;以無厚入有間,恢恢乎其於游刃必有餘地矣。
blog: http://shell909090.org/

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

叉叉

unread,
Jun 8, 2018, 1:01:15 AM6/8/18
to pyth...@googlegroups.com
在 2018年6月7日 下午11:37,王恩俊 <aladdi...@gmail.com> 写道:
> 它为什么会被复用呢?
> 不是说离开作用域就会被销毁吗?

python变量的作用域是模块范围或函数范围的。
循环结束后,你依然可以访问到它。



>
>
> On Thursday, June 7, 2018 at 10:38:36 PM UTC+8, shell909090 wrote:
>>
>> Python源码解析
>> 这个确实应该是固定值啊。
>> j循环的那个list,始终处于复用中。
>>
>> On Thu, Jun 7, 2018 at 4:51 PM 王恩俊 <aladdi...@gmail.com> wrote:
>>>
>>> for i in range(100000):
>>> for j in range(100000):
>>> pass
>>>
>>> python2运行这段代码的进程,所占用的内存为什么是一个固定值?
>>> 而且这个值跟两层range的大小线性相关。
>>>
>>> 是什么原因会造成这种现象?
>>> 是range的实现,还是Python的垃圾回收机制
>>> python2的range似乎会直接返回一个list, 应该是会耗内存的
>>>
>>> --
>>> 邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
>>> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
>>> 详情: http://code.google.com/p/cpyug/wiki/CpyUg
>>> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
>>> ---
>>> 您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
>>> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
>>> 要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
>>> 要查看更多选项,请访问https://groups.google.com/d/optout
>>
>>
>>
>> --
>> 彼節者有間,而刀刃者無厚;以無厚入有間,恢恢乎其於游刃必有餘地矣。
>> blog: http://shell909090.org/
>> twitter: @shell909090
>> about.me: http://about.me/shell909090
>
> --
> 邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 详情: http://code.google.com/p/cpyug/wiki/CpyUg
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> ---
> 您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。

tao liu

unread,
Jun 8, 2018, 1:27:44 AM6/8/18
to pyth...@googlegroups.com
主要是以引用计数为主,然后以标记-清楚,分代回收为辅。

#define Py_INCREF(op)   ((op)->ob_refcnt++) //增加计数
#define Py_DECREF(op) \ //减少计数
    if (--(op)->ob_refcnt != 0) \
        ; \
    else \
        __Py_Dealloc((PyObject *)(op))


叉叉 <tor...@gmail.com> 于2018年6月8日周五 下午1:01写道:
您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要向此群组发帖,请发送电子邮件至 pyth...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/d/optout

tao liu

unread,
Jun 8, 2018, 1:29:11 AM6/8/18
to pyth...@googlegroups.com
https://ltoddy.github.io/essay/2018/06/06/python-gc.html

我自己 面试的时候复习看的。

tao liu <taoli...@gmail.com> 于2018年6月8日周五 下午1:27写道:

依云

unread,
Jun 8, 2018, 1:34:05 AM6/8/18
to pyth...@googlegroups.com
On Thu, Jun 07, 2018 at 01:51:01AM -0700, 王恩俊 wrote:
> for i in range(100000):
> for j in range(100000):
> pass
>
> python2运行这段代码的进程,所占用的内存为什么是一个固定值?
> 而且这个值跟两层range的大小线性相关。

你为什么认为它的内存不应该是一个固定值呢?绝大部分时刻,就两个 list 两个
整数在啊。没变化,当然是固定的了。

> 是什么原因会造成这种现象?
> 是range的实现,还是Python的垃圾回收机制
> python2的range似乎会直接返回一个list, 应该是会耗内存的


--
Best regards,
lilydjwg

Linux Vim Python 我的博客:
https://blog.lilydjwg.me/
--
A: Because it obfuscates the reading.
Q: Why is top posting so bad?

Shell Xu

unread,
Jun 8, 2018, 5:29:01 AM6/8/18
to CUPG
按照楼主的写法,就算在循环的时候也是访问不到完整的list的。。。

您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要向此群组发帖,请发送电子邮件至 pyth...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/d/optout

王恩俊

unread,
Jun 11, 2018, 9:44:54 PM6/11/18
to python-cn(华蟒用户组,CPyUG 邮件列表)
是用python2.7运行这段代码
所以range返回的是完整list
按照楼主的写法,就算在循环的时候也是访问不到完整的list的。。。

>>> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com
>>> 要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com

>>> 要查看更多选项,请访问https://groups.google.com/d/optout
>>
>>
>>
>> --
>> 彼節者有間,而刀刃者無厚;以無厚入有間,恢恢乎其於游刃必有餘地矣。
>> blog: http://shell909090.org/
>> twitter: @shell909090
>> about.me: http://about.me/shell909090
>
> --
> 邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 详情: http://code.google.com/p/cpyug/wiki/CpyUg
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> ---
> 您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com
> 要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com

> 要查看更多选项,请访问https://groups.google.com/d/optout

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com

要向此群组发帖,请发送电子邮件至 pyth...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/d/optout

王恩俊

unread,
Jun 11, 2018, 9:46:13 PM6/11/18
to python-cn(华蟒用户组,CPyUG 邮件列表)
非常感谢
https://ltoddy.github.io/essay/2018/06/06/python-gc.html

我自己 面试的时候复习看的。

>>> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com
>>> 要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com

>>> 要查看更多选项,请访问https://groups.google.com/d/optout
>>
>>
>>
>> --
>> 彼節者有間,而刀刃者無厚;以無厚入有間,恢恢乎其於游刃必有餘地矣。
>> blog: http://shell909090.org/
>> twitter: @shell909090
>> about.me: http://about.me/shell909090
>
> --
> 邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 详情: http://code.google.com/p/cpyug/wiki/CpyUg
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> ---
> 您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com
> 要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com

> 要查看更多选项,请访问https://groups.google.com/d/optout

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com

赵亮

unread,
Jun 11, 2018, 10:20:36 PM6/11/18
to pyth...@googlegroups.com
最近也在调研python解释器相关资料,讲python垃圾回收最好的资料是cpython源码,别人总结的二手信息说的人云里雾里,达不到理解的程度。

对一个python对象来说,引用计数降为0时,会调用这个对象的dealloc函数,这个函数一般会调用free函数。例如tuple的dealloc函数:
static void  tupledealloc(PyTupleObject *op) {
    ....
   Py_TYPE(op)->tp_free((PyObject *)op);
   ...
}

tp_free,实际上是下面函数:
void PyObject_GC_Del(void *op) {
    PyGC_Head *g = AS_GC(op);
    if (IS_TRACKED(op))
        gc_list_remove(g);
    if (_PyRuntime.gc.generations[0].count > 0) {
        _PyRuntime.gc.generations[0].count--;
    }
    PyObject_FREE(g);
}

先移除对gc对该对象的关注,然后free掉。gc主要是用来引入用来解决循环引用的问题,如果通过其他方式解决循环引用(例如强弱引用)的问题,就可以关掉gc,只使用引用计数,像Instagram那样。

python对内存使用经过了好多层,真正到操作系统层面看到的内存使用不代表python实际的内存使用,引用自cpython/obmallo.c中注释:
    Object-specific allocators
    _____   ______   ______       ________
   [ int ] [ dict ] [ list ] ... [ string ]       Python core         |
+3 | <----- Object-specific memory -----> | <-- Non-object memory --> |
    _______________________________       |                           |
   [   Python's object allocator   ]      |                           |
+2 | ####### Object memory ####### | <------ Internal buffers ------> |
    ______________________________________________________________    |
   [          Python's raw memory allocator (PyMem_ API)          ]   |
+1 | <----- Python memory (under PyMem manager's control) ------> |   |
    __________________________________________________________________
   [    Underlying general-purpose allocator (ex: C library malloc)   ]
 0 | <------ Virtual memory allocated for the python process -------> |

   =========================================================================
    _______________________________________________________________________
   [                OS-specific Virtual Memory Manager (VMM)               ]
-1 | <--- Kernel dynamic storage allocation & management (page-based) ---> |
    __________________________________   __________________________________
   [                                  ] [                                  ]
-2 | <-- Physical memory: ROM/RAM --> | | <-- Secondary storage (swap) --> |
/*==========================================================================*/

如果你真的想搞清楚这个问题,建议去阅读cpython的源码,然后来cpython-cn列表分享一下学到的知识。

Shell Xu

unread,
Jun 11, 2018, 11:24:48 PM6/11/18
to CUPG
你搞错了两个概念。
“返回完整list”和“可访问完整list”。
这么说吧。虽然range返回了全部的list,但是你能在循环中修改任意位置的元素值么?

是用python2.7运行这段代码
按照楼主的写法,就算在循环的时候也是访问不到完整的list的。。。

>>> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
>>> 要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com

>>> 要查看更多选项,请访问https://groups.google.com/d/optout
>>
>>
>>
>> --
>> 彼節者有間,而刀刃者無厚;以無厚入有間,恢恢乎其於游刃必有餘地矣。
>> blog: http://shell909090.org/
>> twitter: @shell909090
>> about.me: http://about.me/shell909090
>
> --
> 邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 详情: http://code.google.com/p/cpyug/wiki/CpyUg
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> ---
> 您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
> 要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com

> 要查看更多选项,请访问https://groups.google.com/d/optout

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com

要向此群组发帖,请发送电子邮件至 pyth...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/d/optout


--
彼節者有間,而刀刃者無厚;以無厚入有間,恢恢乎其於游刃必有餘地矣。
blog: http://shell909090.org/

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

Shell Xu

unread,
Jun 11, 2018, 11:31:21 PM6/11/18
to CUPG
同学,你看错位置了。对楼主的问题来说,关键起作用的代码如下:

Python-2.7.12/Objects/listobject.c:94-98
#ifndef PyList_MAXFREELIST
#define PyList_MAXFREELIST 80
#endif
static PyListObject *free_list[PyList_MAXFREELIST];
static int numfree = 0;

Python-2.7.12/Objects/listobject.c:PyList_New
...
    if (numfree) {
        numfree--;
        op = free_list[numfree];
        _Py_NewReference((PyObject *)op);
#ifdef SHOW_ALLOC_COUNT
        count_reuse++;
#endif
...

Python-2.7.12/Objects/listobject.c:list_dealloc
...
    if (numfree < PyList_MAXFREELIST && PyList_CheckExact(op))
        free_list[numfree++] = op;
    else
        Py_TYPE(op)->tp_free((PyObject *)op);
...



非常感谢
https://ltoddy.github.io/essay/2018/06/06/python-gc.html

我自己 面试的时候复习看的。

>>> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
>>> 要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com

>>> 要查看更多选项,请访问https://groups.google.com/d/optout
>>
>>
>>
>> --
>> 彼節者有間,而刀刃者無厚;以無厚入有間,恢恢乎其於游刃必有餘地矣。
>> blog: http://shell909090.org/
>> twitter: @shell909090
>> about.me: http://about.me/shell909090
>
> --
> 邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 详情: http://code.google.com/p/cpyug/wiki/CpyUg
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> ---
> 您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
> 要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com

> 要查看更多选项,请访问https://groups.google.com/d/optout

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com

要向此群组发帖,请发送电子邮件至 pyth...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/d/optout

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

ggarlic

unread,
Jun 12, 2018, 9:31:13 AM6/12/18
to pyth...@googlegroups.com
文章最后的阈值,0代是对的,但是很后面应该是0代回收10次,会启动1代,1代回收10次,会启动二代。

On Fri Jun 08 13:28 , tao liu wrote:
> https://ltoddy.github.io/essay/2018/06/06/python-gc.html
>
> 我自己面试的时候复习看的。
>
> tao liu <taoli...@gmail.com> 于2018年6月8日周五下午1:27写道:
>
> 主要是以引用计数为主,然后以标记-清楚,分代回收为辅。
>
>
> #define Py_INCREF(op) ((op)->ob_refcnt++) //增加计数
> #define Py_DECREF(op) \ //减少计数
> if (--(op)->ob_refcnt != 0) \
> ; \
> else \
> __Py_Dealloc((PyObject *)(op))
>
>
>
> 叉叉 <tor...@gmail.com> 于2018年6月8日周五下午1:01写道:
>
signature.asc

dawang dong

unread,
Jul 19, 2018, 11:57:15 PM7/19/18
to python-cn(华蟒用户组,CPyUG 邮件列表)
你好,仔细拜读了你的这篇文章,但是没明白python是怎么判断一个对象存在循环引用的。
能讲解下吗?

在 2018年6月8日星期五 UTC+8下午1:29:11,tao liu写道:
https://ltoddy.github.io/essay/2018/06/06/python-gc.html

我自己 面试的时候复习看的。

>>> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com
>>> 要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com

>>> 要查看更多选项,请访问https://groups.google.com/d/optout
>>
>>
>>
>> --
>> 彼節者有間,而刀刃者無厚;以無厚入有間,恢恢乎其於游刃必有餘地矣。
>> blog: http://shell909090.org/
>> twitter: @shell909090
>> about.me: http://about.me/shell909090
>
> --
> 邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 详情: http://code.google.com/p/cpyug/wiki/CpyUg
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> ---
> 您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com
> 要发帖到此群组,请发送电子邮件至python-cn@googlegroups.com

> 要查看更多选项,请访问https://groups.google.com/d/optout

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+unsubscribe@googlegroups.com

panfei

unread,
Jul 20, 2018, 3:45:42 AM7/20/18
to 华蟒用户组
https://book.douban.com/subject/26821357/

看了确实不错,才推荐的,里面有专门的部分对Python的垃圾回收机制做了讲解。

dawang dong <djhsok...@gmail.com> 于2018年7月20日周五 上午11:57写道:
你好,仔细拜读了你的这篇文章,但是没明白python是怎么判断一个对象存在循环引用的。
https://ltoddy.github.io/essay/2018/06/06/python-gc.html

我自己 面试的时候复习看的。

>>> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
>>> 要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com

>>> 要查看更多选项,请访问https://groups.google.com/d/optout
>>
>>
>>
>> --
>> 彼節者有間,而刀刃者無厚;以無厚入有間,恢恢乎其於游刃必有餘地矣。
>> blog: http://shell909090.org/
>> twitter: @shell909090
>> about.me: http://about.me/shell909090
>
> --
> 邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
> 规则: http://code.google.com/p/cpyug/wiki/PythonCn
> 详情: http://code.google.com/p/cpyug/wiki/CpyUg
> 严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
> ---
> 您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
> 要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com

> 要查看更多选项,请访问https://groups.google.com/d/optout

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了 Google 网上论坛的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com

要向此群组发帖,请发送电子邮件至 pyth...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/d/optout

--
邮件来自: `CPyUG`华蟒用户组(中文Python技术邮件列表)
规则: http://code.google.com/p/cpyug/wiki/PythonCn
详情: http://code.google.com/p/cpyug/wiki/CpyUg
严正: 理解列表! 智慧提问! http://wiki.woodpecker.org.cn/moin/AskForHelp
---
您收到此邮件是因为您订阅了Google网上论坛上的“python-cn(华蟒用户组,CPyUG 邮件列表)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到python-cn+...@googlegroups.com
要发帖到此群组,请发送电子邮件至pyth...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout


--
不学习,不知道
Reply all
Reply to author
Forward
0 new messages