Why is insertion sort faster than bubble sort?

Both insertion and bubble sorts have big-O runtime of O(n2), which means that, for example, if the input list doubles in length (to 2n), then we expect the run time to quadruple (to 4n2). In practice, though, insertion sort may make fewer swaps than bubble sort, and this may result in a faster actual runtime.

Practically, is one of bubble or selection sort better than the other?

It depends what criteria you are using to evaluate "better"ness. For runtime, they both have the same order (O(n2)), so they are the same. (Also note: all three sorting algorithms we've seen --- selection, bubble, and insertion sorts --- finish with a correctly sorted list and never make mistakes. This is important! You definitely wouldn't call an algorithm that sometimes makes mistakes "better" than selection sort, even though it might be faster.)

In practice, selection and insertion sort will be faster than bubble sort, so you might prefer selection or insertion sort. If you want an algorithm that is easy to code, read, and understand, then I think bubble sort is probably the "best".

If what you care about is quickly sorting a list, then you will probably not use any of these sorts... we'll see some even faster, always-correct sorting algorithms later in the semester.