Sitelet https://github.com/python/cpython/issues/95385
Skip to content

Fastpath for encoding unsorted dict to JSON #95385

Description

@aivarsk

JSON encoder can produce output sorted by key (json.dumps(sort_keys=True)) The default value for sort_keys is False. The code always creates a list of dictionary items, sorts them if needed, and then iterates through them.
However, if sorting is not requested we can use PyDict_Next to avoid allocating a list of tuples.

pyperformance on my machine before changes:

### json_dumps ###
Mean +- std dev: 10.6 ms +- 0.1 ms

pyperformance after changes:

### json_dumps ###
Mean +- std dev: 9.00 ms +- 0.08 ms

Activity

  1. aivarsk commented on Jul 29, 2022

    @aivarsk
    ContributorAuthor

    Patched pyperformance to use json.dumps(sort_keys=True)

    before changes

    ### json_dumps ###
    Mean +- std dev: 14.0 ms +- 0.2 ms
    

    after changes

    ### json_dumps ###
    Mean +- std dev: 13.6 ms +- 0.2 ms
    

    Probably because the new code does not create an iterator from the list and PyList_GET_ITEM is a bit faster than PyIter_Next (extra incref/decref)?

  2. added a commit that references this issue on Aug 6, 2022
  3. added a commit that references this issue on Aug 11, 2022
  4. serhiy-storchaka commented on Dec 15, 2022

    @serhiy-storchaka
    Member

    It caused a regression for OrderedDict. See #100272.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.12only security fixesperformancePerformance or resource usagetype-featureA feature request or enhancement

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions