PHP yield作用

 生成器配合迭代器某些场景大大减少了内存消耗
 public function da()
    {
       for($i=0;$i<100000;$i++){
           yield $i;
       }
    }

    public function cs()
    {
        $data = [];
        for($i=0;$i<100000;$i++){
            $data[] =  $i;
        }
        return $data;
    }
    public function index()
    {
        $data = $this->cs();
        foreach ($data as $val){
            echo $val.'<br />';
        }
        echo "初始: ".memory_get_usage()."B\n";
        $str = str_repeat('hello', 1000);
        echo "使用: ".memory_get_usage()."B\n";
        unset($str);
        echo "释放: ".memory_get_usage()."B\n";
        echo "峰值: ".memory_get_peak_usage()."B\n";
    }
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201210111826889.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NTX19Mb3Zl,size_16,color_FFFFFF,t_70#pic_center)
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201210111853280.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0NTX19Mb3Zl,size_16,color_FFFFFF,t_70#pic_center)


### Yield 的具体功能和使用场景 在编程中,`yield` 是一个关键字,主要用于生成器函数中。它的主要作用是将函数的执行暂停,并返回一个值给调用者,同时保留函数当前的状态。当函数再次被调用时,它会从上次暂停的地方继续执行,而不是重新开始。这种特性使得 `yield` 在处理大规模数据流或需要逐步生成结果的场景下非常有用。 #### 1. **Yield 的基本功能** `yield` 的核心功能是将函数转换为生成器(generator)。与普通的函数不同,生成器不会一次性计算所有结果,而是按需生成结果。这种方式可以显著减少内存占用,特别是在处理大数据集时[^2]。 ```python def simple_generator(): yield "First" yield "Second" yield "Third" gen = simple_generator() print(next(gen)) # 输出 "First" print(next(gen)) # 输出 "Second" print(next(gen)) # 输出 "Third" ``` #### 2. **Yield 的暂停与恢复机制** 通过 `yield`,函数可以在每次调用时暂停其执行,并保存当前的状态(包括局部变量、指令指针等)。当下次调用该生成器时,函数会从上一次暂停的地方继续执行。这种特性使得生成器非常适合用于实现迭代器协议[^4]。 #### 3. **Yield 的应用场景** - **惰性求值**:`yield` 可以用于实现惰性求值(lazy evaluation),即仅在需要时才生成下一个值。这在处理无限序列或大文件时特别有用。 ```python def infinite_sequence(): num = 0 while True: yield num num += 1 gen = infinite_sequence() for _ in range(5): print(next(gen)) # 输出 0 到 4 ``` - **数据流处理**:在需要逐步读取或处理大量数据时,`yield` 可以避免一次性加载所有数据到内存中。 ```python def read_large_file(file_path): with open(file_path, 'r') as file: for line in file: yield line.strip() for line in read_large_file('large_file.txt'): print(line) ``` - **异步编程**:虽然 Python 中的异步编程主要依赖于 `async` 和 `await`,但在早期版本中,`yield` 曾被用来实现协程的功能。例如,在 Python 3.4 之前,`yield` 被广泛用于手动控制协程的暂停和恢复[^1]。 #### 4. **Yield 与其他语言的对比** 在不同的编程语言中,`yield` 的实现和用途可能有所不同。例如,在 PHP 中,`yield` 同样用于生成器函数,但它也可以结合静态变量来实现更复杂的逻辑[^3]。而在 JavaScript(ES6)中,`yield` 主要用于生成器函数和迭代器协议,增强了代码的表达能力和灵活性[^4]。 #### 5. **性能优化** 使用 `yield` 可以显著降低内存消耗,因为它避免了将所有数据一次性加载到内存中。此外,生成器函数的执行效率通常高于传统的列表或其他容器类型,尤其是在处理大规模数据时[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值