Usually I don’t have trouble getting pretty consistent results. Repetition helps, alternating between the solutions helps, fixing the CPU frequency helps, keeping the machine pretty idle helps. Sometimes I benchmarked on a Google compute engine instance with two vCPUs (not shared, almost nothing running on it, and I think their frequency is fixed), which provided very stable results. And I’m mostly interested in relative speeds, so even if a few minutes later all solutions are 10% slower, that doesn’t matter.
This case is really a huge exception. Especially that one solution affects the time of another not just at all but so very much.
Yes. I wanted to focus on the gap between 512kB and 1MB.
I also tested for some cases like:
def test(x):
b = bytearray(int(2**x))
bytes(b) # consumes (2^x) bytes.
bytes(b) # no consumption ? Id's are frequently the same for x < 20.
In this case, the second bytes(b) is often the same as the first one and does not consume another (2^x) bytes, so the gap is shifted by about -1 instead of -1.6 (~log2(3)) as follows.
Test for checking if the first and second `bytes(b)` IDs are the same: (click to expand)
def test(x):
b = bytearray(int(2**x))
i = id(bytes(b))
j = id(bytes(b))
print('o' if i==j else ' ', end='')
print('| '*14, end='')
gives
10 11 12 13 14 15 16 17 18 19 20 21 22 23
| | | | | | | | | | | | | | Trial 0...
o o o ooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o o o o Trial 1...
o o o oooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o o Trial 2...
o oo o oooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o o Trial 3...
o o oooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o o Trial 4...
o oo oooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o o Trial 5...
o o oo oooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o o o Trial 6...
o ooooooooooooo ooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o o o o Trial 7...
o o oo ooooooooooooo ooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o o Trial 8...
oo oooooooooooo ooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o o Trial 9...
o oo ooooooooooooo ooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o Trial 10...
oo oooooooooooo ooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o oTrial 11...
oooo oooooooooooo ooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o Trial 12...
o oooooooooooo ooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o o o Trial 13...
o o o oooooooooooo ooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o o Trial 14...
oo o oooooooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o o Trial 15...
ooooo oooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o o o Trial 16...
o oo o oooooooooooo ooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo Trial 17...
oo oooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo oo Trial 18...
o oooooooooooooooo ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo o o Trial 19...
I am on Windows.
I only see that there is a complicated mechanism at the 1MB boundary, but give up going deeper.