for(1..200000) {...}
vs for($_=1;$_<=200000;$_++) {...}
第一个是否必须创建一个包含200,000个项目的数组,或者它与第二个项目大致相同?
答案 0 :(得分:10)
我可以明确地说,for
范围($lower .. $upper
)不会在内存中创建实际的临时列表。 It did 12 years ago, but not anymore.事实上,它提供了更好的性能,而不是显式C风格的for循环(正如其他人的基准测试所示),因为Perl能够进行计数循环在漂亮,高效的内部代码中。你不应该害怕使用它。
答案 1 :(得分:3)
$ 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
所以前者更快,这表明你的问题的答案是否定的。它很可能在Python中for i in xrange(n)
进行了优化。
答案 2 :(得分:2)
我很好奇是不是因为你在第二次增加$_
和$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
两者都等同于原始的例子;但是,如果你不能退步,它可能无法使用。他们更接近你的第一个结果