Commit d898d27
committed
gh-132108: Add Buffer Protocol support to int.from_bytes
Speed up conversion from `bytes-like` objects like `bytearray` while
keeping conversion from `bytes` stable.
On a `--with-lto --enable-optimizaitons` build on my 64 bit Linux box:
new:
from_bytes_flags: Mean +- std dev: 28.6 ns +- 0.5 ns
bench_convert[bytes]: Mean +- std dev: 50.4 ns +- 1.4 ns
bench_convert[bytearray]: Mean +- std dev: 51.3 ns +- 0.7 ns
old:
from_bytes_flags: Mean +- std dev: 28.1 ns +- 1.1 ns
bench_convert[bytes]: Mean +- std dev: 50.3 ns +- 4.3 ns
bench_convert[bytearray]: Mean +- std dev: 64.7 ns +- 0.9 ns
Benchmark code:
```python
import pyperf
import time
def from_bytes_flags(loops):
range_it = range(loops)
t0 = time.perf_counter()
for _ in range_it:
int.from_bytes(b'\x00\x10', byteorder='big')
int.from_bytes(b'\x00\x10', byteorder='little')
int.from_bytes(b'\xfc\x00', byteorder='big', signed=True)
int.from_bytes(b'\xfc\x00', byteorder='big', signed=False)
int.from_bytes([255, 0, 0], byteorder='big')
return time.perf_counter() - t0
sample_bytes = [
b'',
b'\x00',
b'\x01',
b'\x7f',
b'\x80',
b'\xff',
b'\x01\x00',
b'\x7f\xff',
b'\x80\x00',
b'\xff\xff',
b'\x01\x00\x00',
]
sample_bytearray = [bytearray(v) for v in sample_bytes]
def bench_convert(loops, values):
range_it = range(loops)
t0 = time.perf_counter()
for _ in range_it:
for val in values:
int.from_bytes(val)
return time.perf_counter() - t0
runner = pyperf.Runner()
runner.bench_time_func('from_bytes_flags', from_bytes_flags, inner_loops=10)
runner.bench_time_func('bench_convert[bytes]', bench_convert, sample_bytes, inner_loops=10)
runner.bench_time_func('bench_convert[bytearray]', bench_convert, sample_bytearray, inner_loops=10)
```1 parent 231a50f commit d898d27
2 files changed
Lines changed: 23 additions & 8 deletions
File tree
- Misc/NEWS.d/next/Core_and_Builtins
- Objects
Lines changed: 2 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6439 | 6439 | | |
6440 | 6440 | | |
6441 | 6441 | | |
| 6442 | + | |
6442 | 6443 | | |
6443 | 6444 | | |
6444 | 6445 | | |
| |||
6452 | 6453 | | |
6453 | 6454 | | |
6454 | 6455 | | |
6455 | | - | |
6456 | | - | |
6457 | | - | |
6458 | | - | |
6459 | | - | |
6460 | | - | |
6461 | | - | |
6462 | | - | |
| 6456 | + | |
| 6457 | + | |
| 6458 | + | |
| 6459 | + | |
| 6460 | + | |
| 6461 | + | |
| 6462 | + | |
| 6463 | + | |
| 6464 | + | |
| 6465 | + | |
| 6466 | + | |
| 6467 | + | |
| 6468 | + | |
| 6469 | + | |
| 6470 | + | |
| 6471 | + | |
| 6472 | + | |
| 6473 | + | |
| 6474 | + | |
| 6475 | + | |
6463 | 6476 | | |
6464 | 6477 | | |
6465 | 6478 | | |
| |||
0 commit comments