(1) Если range (n) фактически вычисляет список целых чисел, вы делаете это три раза, а не один раз. (2) В первом случае вы циклически изменяете переменную l oop по списку из n вещей один раз, а во втором - три раза по списку из n вещей.
Я бы представьте себе, что второе никогда не может быть быстрее первого, и в отсутствие оптимизирующего компилятора я бы ожидал, что второе будет значительно медленнее первого.
вы можете попробовать этот эксперимент:
start = time.time()
for i in range(1000000):
for j in range(n):
break
end = time.time()
return c,end-start
Если вы потратите это время и поделите на миллион, у вас будет хорошее представление о первоначальной стоимости диапазона вызовов (n). Я не удивлюсь, если это львиная доля дополнительного времени, которое вы видите (по сравнению с повторением списка еще два раза).
Если это так, вы можете также улучшить свой второй Например, сначала вычисляя x = range (n), а затем трижды используя for i в x.