文件说:
生成器允许您编写使用 foreach 迭代一组数据的代码,而无需在内存中创建数组,这可能会导致内存不足或需要很长时间才能创建它。相反,您可以编写一个生成器函数,它基本上只是一个普通函数,除了不是返回单个值,生成器可以根据需要多次产生值来迭代原始数据集。
上面的说明性示例是使用 range() 函数作为生成器。标准的 range() 函数必须生成并返回一个值数组,这可能会导致生成巨大的数组:例如,调用 range(0, 1000000) 将使用超过 100 MB 的内存。
作为替代方案,我们可以创建一个 xrange() 生成器,它只使用内存来创建 Iterator 对象并保存当前状态,这需要不超过 1 KB 的内存。
生成器允许您编写使用 foreach 迭代一组数据的代码,而无需在内存中构建数组,这可能会导致您超出内存限制,或者需要大量处理时间才能生成。相反,您可以编写一个生成器函数,它与普通函数相同,除了不是返回一次,生成器可以根据需要生成多次,以提供要迭代的值。
一个简单的例子是将 range() 函数重新实现为生成器。标准的 range() 函数必须生成一个包含其中每个值的数组并返回它,这可能会导致数组很大:例如,调用 range(0, 1000000) 将导致使用超过 100 MB 的内存。
作为替代方案,我们可以实现一个 xrange() 生成器,它只需要足够的内存来创建 Iterator 对象并在内部跟踪生成器的当前状态,结果证明它不到 1 KB。
并给出了一个例子:
function xrange($start, $limit, $step = 1) {
if ($start < $limit) {
if ($step <= 0) {
throw new LogicException('Step must be +ve');
}
for ($i = $start; $i <= $limit; $i += $step) {
yield $i;
}
} else {
if ($step >= 0) {
throw new LogicException('Step must be -ve');
}
for ($i = $start; $i >= $limit; $i += $step) {
yield $i;
}
}
}
/*
* Note that both range() and xrange() result in the same
* output below.
*/
echo 'Single digit odd numbers from range(): ';
foreach (range(1, 9, 2) as $number) {
echo "$number ";
}
echo "\n";
echo 'Single digit odd numbers from xrange(): ';
foreach (xrange(1, 9, 2) as $number) {
echo "$number ";
}
我将世代数增加到100000:
range(): https://repl.it/Fy4I;xrange():https ://repl.it/Fy4K 。
结果并没有太大的不同。我认为xrange()使用内存时应该消耗更少。这是为什么?
因为你忘了使用结果
它应该是这样的:
https://repl.it/Fy4I/1
创造了一套完整的价值观。
https://repl.it/Fy4K/1
仅检索到一个值。