ホームページ  >  記事  >  バックエンド開発  >  PHPジェネレーターの使い方

PHPジェネレーターの使い方

小云云
小云云オリジナル
2018-03-26 09:50:501550ブラウズ

一般に、一連のデータを反復するときは、配列が非常に大きい場合、データを作成する必要があります。これにより、パフォーマンスが大幅に消費され、メモリ不足によってエラーがスローされることもあります
例:

//Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes) in D:\php\test\index.php on line 5range(1, 100000000);

PHP5.5反復ジェネレーターの紹介 反復の概念は PHP に古くからありましたが、反復ジェネレーターは PHP の新しい機能です。これは python3 の反復ジェネレーターがどのように定義されているかを見てみましょう。 。
次の例では、配列要素が生成されるたびに、yield キーワードを使用して返され、関数 next メソッドが実行されると、実行は最後に生成された位置から継続されます。例えば、中間変数$iのみが生成されます

function xrange($start, $limit, $step = 1) {    for ($i = $start; $i <= $limit; $i += $step) {
        yield $i;
    }
} 
foreach (xrange(1, 9, 1) as $number) {    echo "$number ";
}

xrangeは反復であり、関数はrange関数と同じです。 range関数を使用すると、関数の内部実装に各反復の中間処理が保存されます。つまり、各中間変数にメモリ空間がある場合、まずプログラムが使用するメモリ空間が大きくなり、メモリの割り当てとメモリのリサイクルによりプログラムの実行時間が長くなります。しかし、yield によって実装された xrange 関数を使用すると、その中のすべての中間変数は 1 つのメモリ $i のみを使用するため、節約される時間とスペースは小さくなります。

それでは、なぜ収量にこれほどの影響があるのでしょうか? Lua の歩留まりを考えると、コルーチンの概念がここにあります。 Lua 言語では、プログラムが yield に達すると、コルーチンを使用してコンテキスト環境が記録され、その後、プログラムの操作権が main 関数に返され、main 関数が再開すると、コルーチンが再び起動され、 yield レコードが読み取られます。これにより、プログラミング言語レベルでマルチコルーチン操作が形成されます。 PHP 5.5 の yield にも同じことが当てはまります。プログラムが yield するために実行されると、現在のプログラムはコンテキストを記録するためにコルーチンを呼び出し、その後 main 関数が動作し続けます。ただし、PHP では、resume のようなキーワードは使用されません。ですが、「コルーチンが呼び出されたときに使用します。たとえば、上記の例の foreach 反復子は収量を呼び出すことができます。したがって、上の例は理解できます。

別の例:

function xrange($start, $end, $step = 1) {    for ($i = $start; $i <= $end; $i += $step) {
      yield $i;
    }
}foreach (xrange(1, 1000000) as $num) {    echo $num, "\n";
}

キーワード: yield に注意してください。これが、この関数 xrange と以前の関数の違いです。通常、値が返され、yield の値は、この反復子がループするたびにこの値を生成するため、反復ジェネレーター関数は、生成されるたびに foreach ループを実行できます。価値。

PHP5.5 より前では、イテレーター インターフェイスを実装するクラスを定義することによってイテレーターが構築されていましたが、yield を通じてイテレーターを構築すると、パフォーマンスがさらに向上し、システムのオーバーヘッドが節約されます。

この方法の利点は明らかです。大量のデータのコレクションを一度にメモリにロードすることなく処理でき、無限に大きなデータ ストリームを処理することもできます。

上記の例に示すように、この反復子の機能は 1 から 1000000 までの数値を生成し、ループで出力することです。前の方法を使用して 1 から 1000000 までの数値を配列に生成すると、次の時間がかかります。すべての結果は使用時にオンデマンドではなく事前に生成する必要があるため、大量のメモリが必要になります。つまり、xrange イテレータが呼び出されるとき、内部の関数は各反復まで実際には実行されません。

関連おすすめ:

PHPジェネレーターの使い方

PHPジェネレーターの機能と使い方を詳しく解説

PHPジェネレーターの詳しい紹介

以上がPHPジェネレーターの使い方の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。