LINUX.ORG.RU

История изменений

Исправление 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% медленнее генераторной версии питона.

Выводы:

  1. В питоне в range(…) и так используется генератор, поэтому сильнее не тормозит. Генераторы являются базовыми конструкциями, поэтому работают чуть лучше, чем ручные.

  2. В ракете что-то не так со стандартной библиотекой. Но даже без неё использование генератора на продолжениях тормозит выполнение примерно в 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% медленнее генераторной версии питона.

Выводы:

  1. В питоне в range(…) и так используется генератор, поэтому сильнее не тормозит. Генераторы являются базовыми конструкциями, поэтому работают чуть лучше, чем ручные.

  2. В ракете что-то не так со стандартной библиотекой. Но даже без неё использование генератора на продолжениях тормозит выполнение примерно в 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

Уже ничего не понимаю.