Производительность Perl: для (1..200000) и для ($ _ = 1; $ _ <= 200000; $ _ ++) - PullRequest
1 голос
/ 02 декабря 2010

for(1..200000) {...} против for($_=1;$_<=200000;$_++) {...}

Должен ли первый создать массив из 200 000 элементов или он примерно такой же, как второй?

Ответы [ 3 ]

10 голосов
/ 02 декабря 2010

Я могу однозначно сказать, что for с диапазоном ($lower .. $upper) не создает фактический временный список в памяти. Это было 12 лет назад, но не больше. И фактически, оно дает лучшую производительность, чем явный цикл for в стиле C (как показали тесты других)потому что Perl может делать подсчет в хорошем, эффективном внутреннем коде.Не бойтесь его использовать.

3 голосов
/ 02 декабря 2010
$ time perl -e '$a=0;for(1..10000000){$a++;}'

real 0m0.523s
user 0m0.520s
sys  0m0.000s

$ time perl -e '$a=0;for($_=1;$_<=10000000;$_++){$a++;}'

real    0m1.309s
user    0m1.300s
sys  0m0.000s

Итак, первое быстрее, что говорит о том, что ответ на ваш вопрос - нет.Скорее всего, оно оптимизировано, так как for i in xrange(n) в Python.

2 голосов
/ 02 декабря 2010

Мне интересно, если это потому, что вы увеличиваете и $_, и $a во втором, тогда как первый выполняет внутреннее приращение.

  • time perl -e 'for($_=1;$_<=10000000;){$_++;}'

    real    0m0.544s
    user    0m0.540s
    sys     0m0.000s
    
  • time perl -e 'for($_=1;$_<=10000000;$_++){$a;}'

    real    0m0.593s
    user    0m0.580s
    sys     0m0.000s
    

    оба избавляются от дополнительной переменной и также имеют более близкие результаты, но они не эквивалентны оригиналупример

Как и JavaScript, обратный цикл while будет даже быстрее, чем ваш второй метод, и немного медленнее, чем ваш первый:

  • time perl -e '$a=0;for($_=10000000;$_--;){$a++;}'

    real    0m0.543s
    user    0m0.530s
    sys     0m0.000s
    
  • time perl -e '$a=0;$_=10000000;while($_--){$a++;}'

    real    0m0.569s
    user    0m0.550s
    sys     0m0.010s
    

    оба эквивалентны исходному примеру;однако это может быть невозможно, если вы не можете отступить назад.они ближе к вашим первым результатам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...