Если вывод происходит в консоль, то Python использует построчную буферизацию, то есть буфер сбрасывается либо при переполнение, либо при получении символа перевода строки, и ещё в при закрытии файла при завершении программы.
Если заменить end на '\n', то числа появляются сразу. Иначе надо использовать flush.
Смысл буферизации в том, что системные вызовы - вещь накладная, и программа с буферизацией работает быстрее (хороший пример - всяческие фильтры, которые читают со stdin, обрабатывают и пишут в stdout).