Skip to content

Conversation

@vstinner
Copy link
Member

@vstinner vstinner commented Sep 22, 2025

Replace PyBytes_FromStringAndSize() and _PyBytes_Resize() with the PyBytesWriter API.

Replace PyBytes_FromStringAndSize() and _PyBytes_Resize() with the
PyBytesWriter API.
@vstinner
Copy link
Member Author

Benchmark:

import pyperf
runner = pyperf.Runner()
sizes = (3, 100, 1000)
for size in sizes:
    runner.timeit(f'{size:,} ASCII chars',
        setup=f's="x"*{size}',
        stmt='s.encode("unicode_escape")')
for size in sizes:
    runner.timeit(f'{size:,} UCS-1 chars',
        setup=f's=chr(0xe9) * {size}',
        stmt='s.encode("unicode_escape")')
for size in sizes:
    runner.timeit(f'{size:,} UCS-2 chars',
        setup=f's=chr(0x20ac) * {size}',
        stmt='s.encode("unicode_escape")')
for size in sizes:
    runner.timeit(f'{size:,} UCS-4 chars',
        setup=f's=chr(0x10ffff) * {size}',
        stmt='s.encode("unicode_escape")')

Results:

Benchmark ref pep782
3 ASCII chars 528 ns 515 ns: 1.03x faster
100 ASCII chars 639 ns 663 ns: 1.04x slower
1,000 ASCII chars 1.67 us 1.70 us: 1.02x slower
3 UCS-1 chars 503 ns 515 ns: 1.02x slower
100 UCS-1 chars 758 ns 773 ns: 1.02x slower
3 UCS-2 chars 502 ns 520 ns: 1.04x slower
100 UCS-2 chars 926 ns 939 ns: 1.01x slower
1,000 UCS-2 chars 4.64 us 4.66 us: 1.00x slower
3 UCS-4 chars 508 ns 524 ns: 1.03x slower
100 UCS-4 chars 1.03 us 1.04 us: 1.02x slower
1,000 UCS-4 chars 5.08 us 5.11 us: 1.01x slower
Geometric mean (ref) 1.01x slower

Benchmark hidden because not significant (1): 1,000 UCS-1 chars

@vstinner vstinner merged commit e578a9e into python:main Sep 22, 2025
47 checks passed
@vstinner vstinner deleted the unicode_escape branch September 22, 2025 21:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant