Warum ist bytes(lst) langsamer als bytearray(lst)?
Posted: 24 Dec 2024, 10:44
Mit lst = [0] * 10**6 bekomme ich Zeiten wie diese:
Ich hätte erwartet, dass bytes(lst) und bytearray(lst) gleich schnell oder bytearray(lst) langsamer sind Erstens, da es sich um den komplizierteren Typ handelt (mehr Funktionalität bietet, da er veränderbar ist). Aber es ist umgekehrt. Und selbst der Umweg bytes(bytearray(lst)) ist viel schneller als bytes(lst)! Warum ist bytes(lst) so langsam?
Benchmark-Skript (Versuchen Sie es online!):
Inspiriert durch eine Antwort, die ebenfalls festgestellt hat, dass bytearray schneller ist.
Code: Select all
5.4 ± 0.4 ms bytearray(lst)
5.6 ± 0.4 ms bytes(bytearray(lst))
13.1 ± 0.7 ms bytes(lst)
Python:
3.13.0 (main, Nov 9 2024, 10:04:25) [GCC 14.2.1 20240910]
namespace(name='cpython', cache_tag='cpython-313', version=sys.version_info(major=3, minor=13, micro=0, releaselevel='final', serial=0), hexversion=51183856, _multiarch='x86_64-linux-gnu')
Benchmark-Skript (Versuchen Sie es online!):
Code: Select all
from timeit import timeit
from statistics import mean, stdev
import random
import sys
setup = 'lst = [0] * 10**6'
codes = [
'bytes(lst)',
'bytearray(lst)',
'bytes(bytearray(lst))'
]
times = {c: [] for c in codes}
def stats(c):
ts = [t * 1e3 for t in sorted(times[c])[:5]]
return f'{mean(ts):5.1f} ± {stdev(ts):3.1f} ms '
for _ in range(25):
random.shuffle(codes)
for c in codes:
t = timeit(c, setup, number=10) / 10
times[c].append(t)
for c in sorted(codes, key=stats):
print(stats(c), c)
print('\nPython:')
print(sys.version)
print(sys.implementation)