Исправление monk, (текущая версия) :
for tooks 12.230478399999999 seconds yield tooks 18.876121 seconds
Я провёл тесты и опечален.
В тесте заменил y.append(k)
на y=0 ... y += k
, чтобы минимизировать тяжёлые операции. Результаты практически не изменились.
$ python3 test.py
for tooks 38.175028483 seconds
yield tooks 50.29791783099999 seconds
А вот с Racket грустно. Со стандартной библиотекой:
~$ /usr/racket/bin/racket test.rkt
for
cpu time: 803 real time: 813 gc time: 0
yield
cpu time: 280953 real time: 286933 gc time: 1847
То есть без генератора в 50 раз быстрее, а с генератором в 6 раз медленнее.
С велосипедной версией генератора с https://stackoverflow.com/questions/44514890/does-call-cc-in-scheme-the-same-thing-with-yield-in-python-and-javascript
$ /usr/racket/bin/racket test2.rkt
for
cpu time: 844 real time: 854 gc time: 0
yield
cpu time: 66769 real time: 68290 gc time: 854
Тут всего лишь на 20% медленнее генераторной версии питона.
Выводы:
В питоне в range(…) и так используется генератор, поэтому сильнее не тормозит. Генераторы являются базовыми конструкциями, поэтому работают чуть лучше, чем ручные.
В ракете что-то не так со стандартной библиотекой. Но даже без неё использование генератора на продолжениях тормозит выполнение примерно в 80 раз.
P.S.
t1 = time.process_time()
i = 0
while i < 10000:
i += 1
y = 0
k = 0
while k < 10000:
k += 1
y += k
t2 = time.process_time()
print('while tooks {} seconds'.format(t2-t1))
$ python3 test2.py
while tooks 56.028962693 seconds
yield tooks 45.322027174 seconds
Уже ничего не понимаю.
Исходная версия monk, :
for tooks 12.230478399999999 seconds yield tooks 18.876121 seconds
Я провёл тесты опечален.
В тесте заменил y.append(k)
на y=0 ... y += k
, чтобы минимизировать тяжёлые операции. Результаты практически не изменились.
$ python3 test.py
for tooks 38.175028483 seconds
yield tooks 50.29791783099999 seconds
А вот с Racket грустно. Со стандартной библиотекой:
~$ /usr/racket/bin/racket test.rkt
for
cpu time: 803 real time: 813 gc time: 0
yield
cpu time: 280953 real time: 286933 gc time: 1847
То есть без генератора в 50 раз быстрее, а с генератором в 6 раз медленнее.
С велосипедной версией генератора с https://stackoverflow.com/questions/44514890/does-call-cc-in-scheme-the-same-thing-with-yield-in-python-and-javascript
$ /usr/racket/bin/racket test2.rkt
for
cpu time: 844 real time: 854 gc time: 0
yield
cpu time: 66769 real time: 68290 gc time: 854
Тут всего лишь на 20% медленнее генераторной версии питона.
Выводы:
В питоне в range(…) и так используется генератор, поэтому сильнее не тормозит. Генераторы являются базовыми конструкциями, поэтому работают чуть лучше, чем ручные.
В ракете что-то не так со стандартной библиотекой. Но даже без неё использование генератора на продолжениях тормозит выполнение примерно в 80 раз.
P.S.
t1 = time.process_time()
i = 0
while i < 10000:
i += 1
y = 0
k = 0
while k < 10000:
k += 1
y += k
t2 = time.process_time()
print('while tooks {} seconds'.format(t2-t1))
$ python3 test2.py
while tooks 56.028962693 seconds
yield tooks 45.322027174 seconds
Уже ничего не понимаю.