CPython implementation optimizations

Singletons

  • Integers in range [-5; 256]

  • Empty string

  • Single Latin-1 letter

IO

  • Efficient buffering: FileIO.read() and FileIO.readall()

  • HTTP and socket buffering

Free lists

When a Python object is destroyed, its type can decided to keep the memory alive to optimize the allocation of future objects. Bultin types using a free list: see clear_freelists() in Modules/gcmodule.c.

Python 3.8 types using a free list:

  • Common types:

    • dict: PyDictObject

    • float: PyFloatObject

    • list: PyListObject

    • set: PySetObject

    • str: PyUnicodeObject

    • tuple: PyTupleObject

  • Other types:

    • async generator value: _PyAsyncGenWrappedValue

    • builtin function: PyCFunctionObject

    • contextvars.Context: PyContext

    • frame: PyFrameObject

    • method: PyMethodObject

Python 2.7 types using a free list:

  • builtin function: PyCFunctionObject

  • float: PyFloatObject

  • frame: PyFrameObject

  • method: PyMethodObject

  • int (but not long): PyIntObject

  • tuple: PyTupleObject

  • unicode: PyUnicodeObject

Others

  • peephole

    • x in {1, 2, 3} => frozenset (constant)

  • Overalllocation

    • list

    • bytearray?

    • PyUnicodeWriter

  • Free list

  • method cache

  • stringlib

    • process long per long, instead of byte per byte

    • use goto

ceval.c

  • computed goto: label + goto

  • fast locals: f_localsplus of a frame

Unicode

  • PEP 393: efficient storage for ASCII

  • ASCII strings only require to copy N bytes to copy N characters: 2 or 4 times faster than applications using UTF-16 or UCS-4

  • findchar: use memchr(), even for UCS-2 and UCS-4

dict

  • specialized for int key

  • specialized for str key

  • hash(str)

list

  • timsort

implemented in C

  • decimal of Python 3.3 is 120x faster than the Python implementation of Python 3.2