2015-10-16 2 views
2

Я работаю на Python и JS в течение некоторого времени, и хотел понять разницу в поведении между выходом для генераторов в питон против в ES6Javascript ES6 выход против выхода в питоне

Используя выход в питоне экономит память как это генерирует по одному элементу за раз. Это то же самое для выхода в ES6?

+2

yes <- не может сказать это как ответ, потому что это одно слово – slebetman

+0

Итак, вы имеете в виду, что доходность в JS также сохраняет память и предпочтительнее использовать? – Praveen

+0

@Kay Это зависит от того, что вы хотите делать с диапазоном чисел. Правен, да. – thefourtheye

ответ

3

Короткий ответ: «Да».

Упрощенный длинный ответ: «Да, хотя генераторы имеют некоторые накладные расходы (исправлены в том смысле, что они не меняются с количеством элементов, которые должны быть сгенерированы), благодаря чему сбережения исчезают, когда количество элементов, которые будут сгенерированы маленький." (Но, конечно, в этом случае общая стоимость достаточно того, что она редко имеет значение в любом случае маленький)

Чрезмерно сложный нюанс в ответ:

CPython (интерпретатор ссылка Python) делает очень мало оптимизации кода ; он может сделать небольшие оптимизы в режиме ожидания в очень ограниченных обстоятельствах (например, он может конвертировать 1 + 2 + x в 3 + x в байт-код, но из-за перегрузки оператора и порядка операций он не может конвертировать x + 1 + 2 в x + 3, поскольку он не может предположить x + 1 вернет int, и он не может знать, что добавление associative для любого типа x оказывается). Поэтому, когда вы используете генератор в CPython, он всегда будет выполняться как генератор во время выполнения.

В отличие от большинства современных браузеров, механизм JavaScript использует JIT-ing для компиляции кода JavaScript с помощью собственного кода; он может сделать speculative/adaptive optimizations, где он компилируется для кода, который предполагает определенные типы и значения, и возвращается к интерпретации исходного JS только в том случае, если допущения терпят неудачу. Это означает, что вы не можете точно сказать, что будет сделано в случае, когда ваш код генератора выполняется в горячем цикле (где дорогостоящий анализ и оптимизация будут считаться целесообразными для долгосрочной экономии).

Если двигатель JS определяет, что генератор обычно производит небольшое количество выходов, которые могут быть рассчитаны загодя, которые обычно полностью потребляются, что процесс генерации не имеет видимых побочных эффектов, и что это будет более эффективный и не слишком интенсивный объем памяти, он вполне мог бы создавать собственный код, который фактически не создает или не запускает генератор, а вместо этого производит Array выходов (или для таких вещей, как номера, возможно, ES6 typed array для уменьшения использование памяти). Я не понимаю, какие JS-двигатели, если таковые имеются, могут попытаться выполнить такую ​​оптимизацию, но учитывая, как быстро изменилось современное состояние для двигателей JS за последние семь лет или около того (самый медленный обычно используемый современный двигатель JS вероятно, по крайней мере, в 10 раз быстрее, чем самый быстрый двигатель с 1 сентября 2008 года, до выпуска V8), оптимизация, которая происходит сегодня, может легко измениться завтра.

Смежные вопросы