PHP yield代替range生成范围内的数
<?php
function yieldRange($start, $limit, $step)
{
if ($start == $limit || $step == 0) {
return $start;
} $mark = ($limit - $start > 0) == ($step > 0);
if (!$mark) {
$step = -$step;
} $distance = abs($limit - $start);
for ($i = $start; abs($start - $i) <= $distance; $i += $step) {
yield $i;
}
} $start = microtime(TRUE);
foreach (yieldRange(-1, 10, 1) as $number) {
echo "number$number : " . $number . "\n";
}
$end = microtime(TRUE);
echo "Time Used : " .($end - $start). "\n";
和 PHP 内部的函数 range() 对比了一下,在时间没看出有什么的优势,主要是在内存的使用 方式 上吧,有些情况 range() 的使用方式内存占用还是比较大的.
下面的情况内存使用情况的是差不多的:
yield.php
<?php
function yieldRange($start, $limit, $step)
{
if ($start == $limit || $step == 0) {
return $start;
} $mark = ($limit - $start > 0) == ($step > 0);
if (!$mark) {
$step = -$step;
} $distance = abs($limit - $start);
for ($i = $start; abs($start - $i) <= $distance; $i += $step) {
yield $i;
}
} echo "yield start memory : " . memory_get_usage()." bytes\n";
foreach (yieldRange(1, 10000, 1) as $yield) {
}
echo "yield end memory : " . memory_get_usage()." bytes\n";
range.php
<?php
echo "range() start memory : " . memory_get_usage()." bytes\n";
foreach (range(1, 10000, 1) as $range) {
}
echo "range() end memory : " . memory_get_usage()." bytes\n";
差不多就是 32 个字节的使用,刚好32位的指针地址.(平台可能有差异)
但是,如果直接把 range() 的返回值赋给一个变量,那就不只是 32 个字节的的问题了.
<?php
echo "range() start memory : " . memory_get_usage()." bytes\n";
$ranges = range(1, 10000, 1);
foreach ($ranges as $range) {
}
echo "range() end memory : " . memory_get_usage()." bytes\n";

PHP yield代替range生成范围内的数的更多相关文章
- JSON C# Class Generator是一个从JSON文本中生成C#内的应用程序
JSON C# Class Generator是一个从JSON文本中生成C#内的应用程序 .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator ...
- C语言实现随机生成0~100的数
#include <iostream> #include <time.h> int main() { srand((unsigned)time(NULL));//srand() ...
- 快速排序算法的实现 && 随机生成区间里的数 && O(n)找第k小 && O(nlogk)找前k大
思路:固定一个数,把这个数放到合法的位置,然后左边的数都是比它小,右边的数都是比它大 固定权值选的是第一个数,或者一个随机数 因为固定的是左端点,所以一开始需要在右端点开始,找一个小于权值的数,从左端 ...
- 省赛i题/求1~n内全部数对(x,y),满足最大公约数是质数的对数
求1~n内全部数对(x,y),gcd(x,y)=质数,的对数. 思路:用f[n]求出,含n的对数.最后用sum[n]求和. 对于gcd(x,y)=a(设x<=y,a是质数),则必有gcd(x/a ...
- Dedecms限制栏目列表生成的最大页数
首先,我们要登陆DEDECMS后台 >> 系统 >> 站点设置 的同条栏目上,添加一个新的变量,变量名称:cfg_listmaxpage,变量说明:栏目生成列表最大页数,变量值 ...
- dedecms:限制栏目列表生成的最大页数防止被采集
dedecms:限制栏目列表生成的最大页数防止被采集 如果您的网站数据量较大,列表很多的话甚至达到上千页,生成列表时就特别耗费时间,这个缺点可以被优化掉:网站好不容易建起来,担心网站内容被采集走,如果 ...
- yield的表达式形式与内置函数
yield的功能: 1. 与return类似,都可以返回值,不一样在于,yield可以返回多个值而且可暂停,再次执行可继续下一步操作,return到了就停止不在继续运行. 2.为封装好的的函数能够使用 ...
- python--表达式形式的yield、面向过程编程、内置函数
yield的表达式形式 def init(func): def wrapper(*args, **kwargs): g = func(*args, **kwargs) next(g) return g ...
- 斐波那契数列 yield 和list 生成
def fab_demo4(max): a,n,b = 0,0,1 while n < max: yield b # 生成器走到这一步返回b,需要再次调用才能继续执行 a,b = b,a+b n ...
随机推荐
- Winform中使用FastReport实现自定义PDF打印预览
场景 Winform中使用FastReport实现简单的自定义PDF导出: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1009 ...
- linux文件系统分区、格式化、挂载、卷标挂载、永久挂载
思想不放松你的行为就不会放松,你的行为放松了,说明你的思想放松了.
- Spring Boot2 系列教程(七)理解自动化配置的原理
Spring Boot 中的自动化配置确实够吸引人,甚至有人说 Spring Boot 让 Java 又一次焕发了生机,这话虽然听着有点夸张,但是不可否认的是,曾经臃肿繁琐的 Spring 配置确实让 ...
- 数据结构之二叉树篇卷三 -- 二叉树非递归遍历(With Java)
Nonrecursive Traversal of Binary Tree First I wanna talk about why we should <code>Stack</c ...
- 代码审计之CSRF原理及修复
在平时的测试中,csrf也是比较容易发现的,主要就是看它对一个操作,有没有检测其时效性(这样表述可能不太准确),一般的防护方法就是添加token来进行校验,并及时对其进行失效处理. 以下所有代码都是我 ...
- Redis数据库之数据基本管理操作
了解并掌握各种数据类型的命令操作方式,以及各种数据类型值的操作方式.同时,熟练记忆列表.哈希.集合和有序集合等数据类型的常用操作命令.能根据指令格式完成相应的指令操作. ①string数据类型的练习 ...
- 猿说python
一.简介 知识改变命运,程序改变世界.互联网时代潜移默化的改变着我们的生活,伴随技术的进步,我想下一个时代应该属于人工智能和机器学习,属于python. pytho ...
- Error running 'tomcat:run' Cannot run program..CreateProcess error=2,系统找不到指定的文件
Error running 'tomcat:run': Cannot run program "tomcat:run" (in directory "D:\WorkTes ...
- 一道短小精悍的JS小题目
看到题目你是不是以为我在开车,没错,我就不承认,你能咋的,你瞅啥,别瞅我,瞅题 题目是这样式的 结果是啥呀,这里我就不买关子了,结果是undefined,相信基础好一点的大佬们一眼就能看出来,像我这种 ...
- Nepxion Discovery【探索】微服务企业级解决方案
Nepxion Discovery[探索]微服务企业级解决方案] Nepxion Discovery[探索]使用指南,基于Spring Cloud Greenwich版.Finchley版和Hoxto ...