Before you can feel why vectorization wins, you must be able to read every symbol the parent note throws at you. This page builds each one from nothing — plain words first, then a picture, then why the topic needs it.
Everything below rests on one fact: how a value is stored decides how fast you can use it.
The picture: think of memory as a long ruler marked off in tiny cells. A float64 occupies 8 consecutive cells and nothing extra.
Why the topic needs it: the whole speed story is "packed raw numbers vs. scattered boxed objects." You cannot understand the difference until you can see what "packed raw" looks like on the ruler. See NumPy Arrays vs Python Lists for the full comparison.
The picture: a raw float64 is a bare number on the ruler. A boxed number is that value hidden inside a cardboard box, and the box sits somewhere else in memory with a string tied from your list to the box.
Why the topic needs it: the parent note lists the loop's four costs — fetch object, check type, dispatch method, allocate new object. Every one of those exists only because the number is boxed. Remove the box (use a NumPy array) and all four costs vanish.
The picture: a bar chart of shrinking blocks, each 1000× thinner than the last.
Why the topic needs it: the parent quotes "τpy≈100 ns" and "τvec≈1 ns." Those numbers are meaningless unless you know a nanosecond is a billionth of a second, so a million of them is only 106×10−9=10−3 s = 1 ms.
Reveal check — how many nanoseconds in one second?
Why the topic needs it: the headline "≈100×" is a limit. As N→∞, the fixed csetup becomes a rounding error, so
Speedup=csetup+NτvecNτpy⟶τvecτpy.
The N's cancel because both top and bottom grow in step; only the per-element ratio survives.
The picture: a straight line (O(N)) versus an upward-curving parabola (O(N2)).
Why the topic needs it: the parent's biggest trap — np.append inside a loop — is bad precisely because it turns an O(N) job into O(N2): each append copies the whole array, so total copying is 1+2+⋯+N≈N2/2. You need Big-O to see why that's catastrophic. Full detail in Big-O Complexity.
Why the topic needs it: these are the verbs of vectorization. Every "FAST" code block in the parent is one of them: arithmetic → ufunc, + across shapes → broadcasting, a[a<0]=0 → mask.
Read it top-down: memory layout and counting feed the cost model; the cost model plus units give the speedup limit; Big-O explains the mistakes; the named tools are how you actually do it.