Stefan Pochmann <[email protected]> added the comment:
I think I have a decent way to isolate the memmove vs for-loop times, in Python
code. Here are example results, five rounds of inserting with list.insert or
with slice assignment. The times for each of the two ways are pretty stable:
insert slice
0.024221 0.006754
0.024157 0.006710
0.024015 0.006734
0.024206 0.006731
0.024123 0.006769
For each run, I build a list of length 2**20 and append one value. Then I can
insert 2**17 more values without the list internally resizing.
Then I measure inserting at index -1 and consider that the baseline, as it
includes all the overhead costs like function calls and other differences
between the two insertion methods.
Then I measure inserting at index -500 and subtract the baseline time. This
difference should reflect how long the memmove or the for-loop took, as that's
the difference between inserting at -1 and at -500. It's what I showed in those
results above.
I chose -500 here because the use case I have in mind is
sortedcontainers.SortedList, which I think mostly involves lists of length 1000
or more (up to 2000), and insertions somewhere in the middle.
Results for index -50 instead:
insert slice
0.002479 0.002217
0.002546 0.002113
0.002566 0.002007
0.002425 0.002081
0.002555 0.002261
I'm btw running Python 3.8.1 32-bit on Windows 10 64-bit on an Intel i5-7200U.
Rest of this message is the benchmark code:
from timeit import repeat
statements = (
'a.insert(-1,0)',
'a.insert(-50,0)',
'a[-1:0] = 0,',
'a[-50:0] = 0,',
)
# Verify that the statements work and don't cause internal list resizes.
for stmt in statements:
a = [0] * 2**20
a.append(0)
size_before = a.__sizeof__()
stmt = compile(stmt, '', 'single')
for _ in range(2**17):
exec(stmt)
assert len(a) == 2**20 + 1 + 2**17
assert a.__sizeof__() == size_before
# Run the benchmark.
print(' insert slice')
for _ in range(5):
times = []
for stmt in statements:
t = min(repeat(stmt, 'a=[0]*2**20; a.append(0)', number=2**17,
repeat=20))
times.append(t)
print('%10.6f' * 2 % (times[1] - times[0], times[3] - times[2]))
----------
status: pending -> open
_______________________________________
Python tracker <[email protected]>
<https://bugs.python.org/issue39801>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com