Skip to content

gh-95913: Edit & expand Optimizations in 3.11 WhatsNew #98426

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Oct 22, 2022
59 changes: 39 additions & 20 deletions Doc/whatsnew/3.11.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1128,33 +1128,52 @@ fcntl
Optimizations
=============

* Compiler now optimizes simple C-style formatting with literal format
containing only format codes ``%s``, ``%r`` and ``%a`` and makes it as
fast as corresponding f-string expression.
This section covers specific optimizations independent of the
:ref:`whatsnew311-faster-cpython` project, which is covered in its own section.

* The compiler now optimizes simple
:ref:`printf-style % formatting <old-string-formatting>` on string literals
containing only the format codes ``%s``, ``%r`` and ``%a`` and makes it as
fast as a corresponding :term:`f-string` expression.
(Contributed by Serhiy Storchaka in :issue:`28307`.)

* "Zero-cost" exceptions are implemented. The cost of ``try`` statements is
almost eliminated when no exception is raised.
(Contributed by Mark Shannon in :issue:`40222`.)
* Integer division (``//``) is better tuned for optimization by compilers.
It is now around 20% faster on x86-64 when dividing an :class:`int`
by a value smaller than ``2**30``.
(Contributed by Gregory P. Smith and Tim Peters in :gh:`90564`.)

* Pure ASCII strings are now normalized in constant time by :func:`unicodedata.normalize`.
(Contributed by Dong-hee Na in :issue:`44987`.)
* :func:`sum` is now nearly 30% faster for integers smaller than ``2**30``.
Copy link
Member

@markshannon markshannon Oct 21, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

sum() is still much slower than 2.7.
Maybe we shouldn't mention this, until it is fixed in 3.12

Copy link
Member Author

@CAM-Gerlach CAM-Gerlach Oct 21, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, though on the other hand, it still a fairly substantial improvement over 3.10, the previous feature version, which seems to me is the main focus of this section—at least in the past, I'm not sure optimizations were only mentioned if they exceeded 2.7's speed for something, since that likely wasn't the case for quite a few of them. That said, I'm certainly not the expert here (unlike you all), and will of course defer to the judgement of @pablogsal as RM and you and rest of the core dev performance folks on whether this should be included, if you think its best left out.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On discuss - release, Pable said "I don’t think there is anything wrong mentioning that is faster than the version in 3.10. After all there was work here to make the situation better and if true, I don’t see why a considerable improvement over the previous version should not be mentioned". Sum is not new, but since we have an optimization section, I agree.

(Contributed by Stefan Behnel in :gh:`68264`.)

* :mod:`math` functions :func:`~math.comb` and :func:`~math.perm` are now up
to 10 times or more faster for large arguments (the speed up is larger for
larger *k*).
(Contributed by Serhiy Storchaka in :issue:`37295`.)
* Resizing lists is streamlined for the common case,
speeding up :meth:`list.append` by ≈15%
and simple :term:`list comprehension`\s by up to 20-30%
(Contributed by Dennis Sweeney in :gh:`91165`.)

* Dict don't store hash value when all inserted keys are Unicode objects.
This reduces dict size. For example, ``sys.getsizeof(dict.fromkeys("abcdefg"))``
becomes 272 bytes from 352 bytes on 64bit platform.
* Dictionaries don't store hash values when all keys are Unicode objects,
decreasing :class:`dict` size.
For example, ``sys.getsizeof(dict.fromkeys("abcdefg"))``
is reduced from 352 bytes to 272 bytes (23% smaller) on 64-bit platforms.
(Contributed by Inada Naoki in :issue:`46845`.)

* :mod:`re`'s regular expression matching engine has been partially refactored,
and now uses computed gotos (or "threaded code") on supported platforms. As a
result, Python 3.11 executes the `pyperformance regular expression benchmarks
<https://pyperformance.readthedocs.io/benchmarks.html#regex-dna>`_ up to 10%
faster than Python 3.10.
* Using :class:`asyncio.DatagramProtocol` is now orders of magnitude faster
when transferring large files over UDP,
with speeds over 100 times higher for a ≈60 MiB file.
(Contributed by msoxzw in :gh:`91487`.)

* :mod:`math` functions :func:`~math.comb` and :func:`~math.perm` are now
≈10 times faster for large arguments (with a larger speedup for larger *k*).
(Contributed by Serhiy Storchaka in :issue:`37295`.)

* The :mod:`statistics` functions :func:`~statistics.mean`,
:func:`~statistics.variance` and :func:`~statistics.stdev` now consume
iterators in one pass rather than converting them to a :class:`list` first.
This is twice as fast and can save substantial memory.
(Contributed by Raymond Hettinger in :gh:`90415`.)

* :func:`unicodedata.normalize`
now normalizes pure-ASCII strings in constant time.
(Contributed by Dong-hee Na in :issue:`44987`.)


.. _whatsnew311-faster-cpython:
Expand Down