uk
Feedback

Не попадись на ботовода! Telemetrio знаходить і позначає такі канали мітками 👉 Хочеш бачити мітку, оформляй підписку

CPython notes

CPython notes

Відкрити в Telegram

Author: Kirill Podoprigora aka @backinblacknext

Показати більше
2 382
Підписники
-124 години
-17 днів
-1030 днів
Архів дописів
https://peps.python.org/pep-0774/ Коротко говоря: это не отказ от LLVM.

В asyncio добавили возможность смотреть граф вызова корутин Ждем в python3.14: https://github.com/python/cpython/commit/188598851d5cf475fa57b4ec21c0e88ce9316ff0 Пример:

import asyncio

async def test():
    asyncio.print_call_graph()

async def main():
    async with asyncio.TaskGroup() as g:
        g.create_task(test(), name=test.__name__)

asyncio.run(main())
Выведет:

* Task(name='test', id=0x10304eee0)
  + Call stack:
  |   File '/Users/sobolev/Desktop/cpython2/Lib/asyncio/graph.py', line 278, in print_call_graph()
  |   File '/Users/sobolev/Desktop/cpython2/ex.py', line 4, in async test()
  + Awaited by:
    * Task(name='Task-1', id=0x1034a1e60)
      + Call stack:
      |   File '/Users/sobolev/Desktop/cpython2/Lib/asyncio/taskgroups.py', line 121, in async TaskGroup._aexit()
      |   File '/Users/sobolev/Desktop/cpython2/Lib/asyncio/taskgroups.py', line 72, in async TaskGroup.__aexit__()
      |   File '/Users/sobolev/Desktop/cpython2/ex.py', line 7, in async main()
Как оно работает? Появилось два новых важных изменений: - Поле Frame.f_generator – оно хранит генератор или корутину, которая владеет данным фреймом. Нужно чтобы отрисовывать + Call stack: - Новое свойство у Future

    @property
    def _asyncio_awaited_by(self):
        if self.__asyncio_awaited_by is None:
            return None
        return frozenset(self.__asyncio_awaited_by)
Нужно, чтобы отрисовывать + Awaited by:. Конечно же есть две иплементации. На питоне уже показал, вот так оно на C:

/*[clinic input]
@critical_section
@getter
_asyncio.Future._asyncio_awaited_by
[clinic start generated code]*/

static PyObject *
_asyncio_Future__asyncio_awaited_by_get_impl(FutureObj *self)
/*[clinic end generated code: output=... input=...]*/
{
    /* Implementation of a Python getter. */
    if (self->fut_awaited_by == NULL) {
        Py_RETURN_NONE;
    }
    if (self->fut_awaited_by_is_set) {
        /* Already a set, just wrap it into a frozen set and return. */
        assert(PySet_CheckExact(self->fut_awaited_by));
        return PyFrozenSet_New(self->fut_awaited_by);
    }

    PyObject *set = PyFrozenSet_New(NULL);
    if (set == NULL) {
        return NULL;
    }
    if (PySet_Add(set, self->fut_awaited_by)) {
        Py_DECREF(set);
        return NULL;
    }
    return set;
}
Как использовать? Конечно же данная фича умеет не только печатать объекты в stdout. Прежде всего – она предоставляет удобное АПИ для различных IDE и дебагеров, которые смогут использовать данную информацию для визуализации: чего вообще у вас там происходит. Ну и мониторинги, и sentry, и много кто еще получит дополнительную мета-информацию о процессе выполнения кода. Документация: https://docs.python.org/3.14/library/asyncio-graph.html Круто? | Поддержать | YouTube | GitHub | Чат |

https://github.com/faster-cpython/ideas/issues/642#issuecomment-2571712347 😁 Тир 1 интерпретатор с tail calls быстрее чем джит :)

https://github.com/python/cpython/issues/127949 Более никаких asyncio policy.

PhD thesis о конструировании высокопроизводительных виртуальных машин для динамических языков. Я с некоторой долей вероятности уверен что текущие оптимизации в CPython в какой-то мере основаны на этой работе. Ее автор кстати участник faster-cpython команды :) https://theses.gla.ac.uk/2975/1/2011shannonphd.pdf За ссылку спасибо @mikhail_efimov!

https://discuss.python.org/t/an-analysis-of-return-in-finally-in-the-wild/70633 Дискуссия о использования return в finally блоке. Вероятно, PEP 601 который предлагает запретить return/break/continue в finally блоке будет вновь рассмотрен.

Был смержен тред-локал байткод - https://github.com/python/cpython/pull/123926 Зачем это нужно и как это связано с nogil aka free-threaded? Напомню, что в версии 3.11 был добавлен так называемый <адаптивный> интерпретатор, который умеет в специализацию. Типичная операция x + y в обычном случае превращается в BINARY_OP опкод, который делает x.__add__(y), что несомненно не очень-то и дешево, так как надо производить лукап __add__ и прочие связанные с этим операции. Адаптивный интерпретатор "подстраивается" под ситуации когда у вас достаточно много случаев в коде когда в операции x + y оба операнда являются интами, и тогда можно сэкономить на лукапе и дергать специализированную сишную функцию для сложения интов, которая не производит никакого лукапа атрибутов, и именно на этом мы выигрываем по производительности. Так вот, в случае с nogil сборкой адаптивный интерпретатор не является потокобезопасным, что делало nogil сборку действительно медленнее(потому что специализация была выключена в nogil сборке). Pull request отмеченный выше делает адаптивный интерпретатор потокобезопасным и вместе с этим у codeobject появляется атрибут co_tlbc :)

Питон самый популярный язык на гитхабе
Питон самый популярный язык на гитхабе

photo content
+1

План на 3.14 от faster-cpython team https://github.com/faster-cpython/ideas/blob/main/3.14/README.md (Cпасибо @serjflint!)

Предложение об отказе от daemon-тредов: https://discuss.python.org/t/getting-rid-of-daemon-threads/68836

Так же как и когда-то был опубликован PEP для JIT (уже после того как его смержили 😅), теперь опубликован PEP для нового REPL: https://peps.python.org/pep-0762/

Вместе с этим, 3.8 более не поддерживается: https://discuss.python.org/t/python-3-8-is-now-officially-eol/66983

Релизнулся питон 3.13! Скачать можно тут: https://www.python.org/downloads/release/python-3130/ Что нового: https://docs.python.org/3.13/whatsnew/3.13.html

https://discuss.python.org/t/incremental-gc-and-pushing-back-the-3-13-0-release/65285 В итоге этот новый сборщик мусора ревертят, из-за ухудшения по производительности в определенных сценариях... sphinx build стал тратить в 3 раза больше времени с этим сборщиком мусора

Теперь я участник Python Core Team. https://discuss.python.org/t/vote-to-promote-kirill-podoprigora/63503/5