Thanks for removing the mystery.

FWIW, here are some of the docs and resources for memory management in
Python;
I share these not to be obnoxious or to atoen, but to point to the docs
that would need updating to explain what is going on if this is not
explicit.

- https://docs.python.org/3/reference/datamodel.html#object.__del__
-
https://docs.python.org/3/extending/extending.html?highlight=__del__#thin-ice
- https://docs.python.org/3/c-api/memory.html
- https://docs.python.org/3/library/gc.html
- https://docs.python.org/3/library/tracemalloc.html
- https://devguide.python.org/gdb/
- https://devguide.python.org/garbage_collector/
-
https://devguide.python.org/garbage_collector/#optimization-reusing-fields-to-save-memory
- https://doc.pypy.org/en/latest/gc_info.html
-
https://github.com/jythontools/jython/blob/master/src/org/python/modules/gc.java
  https://javadoc.io/doc/org.python/jython-standalone/2.7.2/
org/python/modules/gc.html
-
https://github.com/IronLanguages/ironpython2/blob/master/Src/IronPython.Modules/gc.cs

https://github.com/IronLanguages/ironpython2/blob/master/Src/StdLib/Lib/test/crashers/gc_has_finalizer.py

https://github.com/IronLanguages/ironpython2/blob/master/Src/StdLib/Lib/test/crashers/gc_inspection.py

https://github.com/IronLanguages/ironpython3/blob/master/Src/IronPython.Modules/gc.cs

- "[Python-Dev] Re: Mixed Python/C debugging"

https://mail.python.org/archives/list/python-...@python.org/message/Z3S2RAXRIHAWT6JEOXEBPPBTPUTMDZI7/

- @anthonypjshaw's CPython Internals book has a (will have a) memory
management chapter.
- > And then take a look at how @ApacheArrow
  "supports zero-copy reads for lightning-fast data access without
serialization overhead."
- .@blazingsql … #cuDF … @ApacheArrow
  https://docs.blazingdb.com/docs/blazingsql

  … New #DataFrame Interface and when that makes a copy for 2x+ memory use
  - "A dataframe protocol for the PyData ecosystem"

https://discuss.ossdata.org/t/a-dataframe-protocol-for-the-pydata-ecosystem/267

Presumably, nothing about magic del statements would affect C extensions,
Cython, zero-copy reads, or data that's copied to the GPU for faster
processing; but I don't understand this or how weakrefs and c-extensions
share memory that could be unlinked by a del.

Would be interested to see the real performance impact of this potential
optimization:
- 10%:
https://instagram-engineering.com/dismissing-python-garbage-collection-at-instagram-4dca40b29172

On Thu, Apr 9, 2020 at 2:48 PM Andrew Barnert <abarn...@yahoo.com> wrote:

> On Apr 8, 2020, at 23:53, Wes Turner <wes.tur...@gmail.com> wrote:
> >
> > Could something just heuristically add del statements with an AST
> transformation that we could review with source control before committing?
> >
> > When the gc pause occurs is something I don't fully understand. For
> example:
>
> Your examples don’t have anything to do with gc pause.
>
> > FWIW, this segfaults CPython in 2 lines:
> >
> > import ctypes
> > ctypes.cast(1, ctypes.py_object)
>
> Yes, because this is ultimately trying to print the repr of (PyObject*)1,
> which means calling some function that tries to dereference some member of
> a struct at address 1, which means trying to access an int or pointer or
> whatever at address 1 or 9 or 17 or whatever. On most platforms, those
> addresses are going to be unmapped (and, on some, illegally aligned to
> boot), so you’ll get a segfault. This has nothing to do with the GC, or
> with Python objects at all.
>
> > Interestingly, this (tends to?) work; even when there are ah scope
> closures?:
> >
> > import ctypes, gc
> > x = 22
> > _id = id(x)
> > del x
> > gc.collect()
> > y = ctypes.cast(_id, ctypes.py_object).value
> > assert y == 22
>
> The gc.collect isn’t doing anything here.
>
> First, the 22 object, like other small integers and a few other special
> cases, is immortal. Even after you del x, the object is still alive, so of
> course everything works.
>
> Even if you used a normal object that does get deleted, it would get
> deleted immediately when the last reference to the value goes away, in that
> del x statement. The collect isn’t needed and doesn’t do anything relevant
> here. (It’s there to detect reference cycles, like `a.b=b; b.a=a; del a;
> del b`. Assuming a and b were the only references to their objects at the
> start, a.b and b.a are the only references at the end. They won’t be
> deleted by refcounting because there’s still one reference to each, but
> they are garbage because they’re not accessible. The gc.collect is a cycle
> detector that handles exactly this case.)
>
> But your code may well still often work on most platforms. Deleting an
> object rarely unmaps its memory; it just returns that memory to the object
> allocator’s store. Eventually that memory will be reused for another
> object, but until it is, it will often still look like a perfectly valid
> value if you cheat and look at it (as you’re doing). (And even after it’s
> reused, it will often end up getting reused by some object of the same
> shape, so you won’t crash, you’ll just get odd results.)
>
> Anyway, getting off this side track and back to the main point: releasing
> the locals reference to an object that’s no longer being used locally isn’t
> guaranteed to destroy the object—but in CPython, if locals is the only
> reference, the object will be destroyed immediately. That’s why Guido’s
> optimization makes sense.
>
> The only way gc pause is relevant is for other implementations. For
> example, if CPython stops guaranteeing that x is alive until the end of the
> scope under certain conditions, PyPy could decide to do the same thing, and
> in PyPy, there is no refcount; garbage is deleted when it’s detected by the
> GC. So it wouldn’t be deterministic when x goes away, and the question of
> how much earlier does it go away and how much benefit there is becomes more
> complicated than in CPython. But the PyPy guys seem to be really good at
> figuring out how to test such questions empirically.
>
>
>
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/TM37HACF67QFVWVCQIHSX7FDRC2A75CH/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to