Статья Автор: Лебедев Дмитрий Алексеевич

Генератор со списком или без

При решении одной из задач возникла необходимость подсчёта суммы элементов массива по срезам.
Ученик Фома представил следующее решение:
def solve1(A):
  x = sum( [ i for i in A[  : : 2] if ( i % 2 == 0 ) ] )
  y = sum( [ i for i in A[1 : : 2] if ( i % 2 == 1 ) ] )
  return x, y
Учитель сказал, что решение можно сократить и "улучшить"  удалением скобок []
Получилось:
def solve2(A):
  x = sum(  i for i in A[  : : 2] if ( i % 2 == 0 )  )
  y = sum(  i for i in A[1 : : 2] if ( i % 2 == 1 )  )
  return x, y
Фома решил проверить так ли это.
А как думаете Вы?
  1.  Решения одинаковые 
  2.  Решение Фомы быстрее
  3.  Решение учителя быстрее

 

Повторы Длина списка time Фомы (s) time Учителя (s) Комментарий
1_000_000 100 11.45 15.15 1.323
250_000 400 10.20 13.22 1.295
100_000 1_000 9.74 12.06 1.238
25_000 4_000 9.8 12.03 1,227
10_000 10_000 9.57 12.15 1.270
2_500 40_000 8.91 11.794 1.323
1_000 100_000 9.06 11.91 1.317
250 400_000 10.50 13.40 1.276
100 1_000_000 11.07 13.36 1.207
10 10_000_000 11.98 13.39 1.118
1 100_000_000 12.18 12.98 1.066
Для проверки была создана программа, а результаты занесены в таблицу 
(тест проводился на "древнем" компе, но аналогичные цифры получались и на "песочницах")

 


Печать