Найти тему
JIT (jusht-in-time) компилятор работает на 32-битных платформах в Python
🗣 Как вы наверно уже слышали, в начале года в Python добавили JIT (just-in-time) компилятор (пока experimental). Простым языком о нем описано здесь. ❌ Недавно выяснилось, что JIT компилятор не поддерживал 64-битные операнды в 32-битных системах. ➗ На 32-битных платформах разделили 64-битные операнды пополам и записали их отдельно, т. к. невозможно "прогревать" что-либо шире указателя. Это не скажется негативно на нагрузку операндов меньше ширины указателя на любой платформе...
11 месяцев назад
Добавлен метод shutdown в класс asyncio.Queue в Python
Гвидо Ван Россум пару лет назад поднял вопрос: 👨🏻‍🔧 Рассмотрим типичного воркера, который получает элементы из asyncio.Queue. Это может быть такой цикл: ❓ Как производитель мог бы указать воркеру, что рабочих элементов не осталось? 👥 asyncio.Queue- это объект очереди, и представляет собой механизм для передачи данных между асинхронными задачами. Очереди обеспечивают асинхронный обмен данными между задачами, где одна может поместить данные в очередь (enqueue), а другая может извлечь их (dequeue) методами put() и get() соответственно...
11 месяцев назад
Добавлен параметр для рекурсивного поиска в Python
🟢 Функция pathlib.Path.glob() в Python используется для поиска файлов в директории с помощью шаблона (шаблонов). 🔄 Технически в этом коммите произошла замена имени параметра follow_symlinks на recurse_symlinks. ↩️ Всё началось с темы, о том, что pathlib.Path.glob() не следовал по символическим ссылкам, в отличии от glob(). Точнее это было отключено намеренно Гвидо Ван Россумом еще в 2016 году. Были тогда причины. 🙃 Символические ссылки действительно все усложняли. Они могли приводить к бесконечной рекурсии, проблемам с использованием ** шаблона и т...
11 месяцев назад
Повышена производительность posixpath.realpath() в Python
Основное назначение posixpath.realpath() - преобразовать относительный путь или симлинк в его абсолютное представление на файловой системе. Функция ускорена за счет: ✅ Удаления использование рекурсии. ✅ Формирования дочерних путей напрямую, без join()...
11 месяцев назад
Восстановлен функционал importlib.resourses в Python
🔸 importlib.resources - это модуль, который предоставляет функции для работы с ресурсами в пакетах Python. Ресурсы - это файлы, которые включены в пакет Python и доступны для использования модуля. Обычно ресурсы используются для хранения данных, таких как изображения, файлы конфигурации, документация и другие ресурсы, необходимые для работы модуля. 🧹 Функции importlib.resources — {open,read}_{text,binary}, path, is_resource и contents, получишие статус deprecated в версии 3.11 и удаленные в альфа-версиях 3...
11 месяцев назад
Обеспечена потокобезопасность в globals() и builtin в Python
📖 В Python локальные и глобальные переменные хранятся в виде словаря. Вы можете получить доступ к этому словарю с помощью встроенных функций locals() и globals(): 🔡 Когда мы объявляем переменную, Python проверяет его в словаре глобального пространства имен, если его нет, то добавляет. В CPython проверка происходит в LOAD_GLOBAL - это операция байт-кода в CPython, которая загружает глобальную переменную в стек, с помощью функции _PyDict_LoadGlobal(): ➕ Так же функция осуществляет поиск в builtins,...
11 месяцев назад
Обеспечена потокобезопасность семафора в Python
🚦 Структура семафора SemLockObject, в реализации модуля multiprocessing, поддерживает внутреннее поле счетчика count. При работе в качестве рекурсивного мьютекса (RECURSIVE_MUTEX) count — это количество раз, когда поток захватывал мьютекс (т. е. 0, 1, .. N). А при работе в качестве семафора (SEMAPHORE) счетчик часто равен 0 или 1, но может быть отрицательным, если SemLockObject инициализируется с maxvalue > 1. 🔄 Изменение count не является потокобезопасным без GIL внутри процесса. Обратите внимание,...
11 месяцев назад
Улучшена производительности модуля compileall в Python
compileall — это модуль, который предоставляет функции для компиляции файлов Python c расширением .py в байт-код .pyc или .pyo, если был использован оптимизатор. В основном используется чтобы ускорить время запуска программ или обеспечить некоторую защиту от просмотра исходного кода. 💡 Если, например, вызвать команду python -m compileall -f -j 10 -qq ., с десятью воркерами, файлы будут обрабатываться с помощью класса ProcessPoolExecutor модуля concurrent...
11 месяцев назад
Улучшена производительность startswith() и endswith() в Python
🤷‍♂️ Снова мы сегодня об оптимизации. ❓ Позавчера Гвидо Ван Россум поднял вопрос над ускорением метода s.startswith("foo") 🦥 Он отметил, что проверка на то, начинается ли строка с заданной подстроки, происходит медленнее при использовании s.startswith("foo"), чем при использовании s[:3] == "foo". 👥 После обсуждения, ускорили за счет макроса METH_FASTCALL. Когда метод определен с помощью этого макроса, CPython генерирует специальный байт-код для более эффективного вызова функции, чем METH_VARARGS,...
11 месяцев назад
Добавлены хелперы в модуль interpreters в Python
∘ Хелперы добавлены в рамках PEP 734 (ранее PEP 554), где предлагается добавить новый модуль interpreters в стандартную библиотеку для проверки, создания и запуска кода в нескольких интерпретаторах в текущем процессе. 💡 Идея взята из PyConfig API (PEP 587) по преобразованию PyInterpreterConfig в словари и наоборот. ∘ Пока модуль...
11 месяцев назад
Оптимизирован модуль os.path в Python
Модуль os.path предоставляет полезные функций для создания, обработки и манипуляции с путями файлов и каталогов, независимо от операционной системы. 🤷‍♂️ В этом коммите нет существенных изменений, да и скорость функций возросла не сильно, но тем не менее...
11 месяцев назад
Модуль syslog стал потокобезопасным в Python
📜 Модуль syslog предоставляет интерфейс для отправки сообщений в системный лог демона (syslogd) операционной системы. Это позволяет логировать сообщения на сервере в централизованном месте, что может быть полезно для мониторинга и отладки приложений в среде сервера. 🛠 Реализация его находится в файле Modules/syslogmodule.c, где находятся две важные изменяемые глобальные переменные: • static PyObject *S_ident_o = NULL; — переменная-указатель PyObject, которая используется для хранения строки идентификатора, передаваемой функции openlog()...
11 месяцев назад