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 ...
随机推荐
- GridView和ImageSwitcher以及ImageView
网格布局GridView和Listview很相似,只不过前者是多列的.如果把GridView的android:numColumns设置为1,他就是ListView了. 通过GridView和Image ...
- Winform中通过代码设置DevExpress的TextEdit的类型为Numbernic
场景 使用DevExpress的EditText控件时,需要限制其输入类型为数字. 正常来说是窗体上拖拽一个TextEdit,然后在设计窗口点击小三角,选择Change Mask 但是如果说TextE ...
- 微信支付中分账功能 填坑指南V1
公司是做电商的,近期开发了一款小程序,准备线上线下同步销售玩具.这里就涉及到微信支付的功能,网上有很多教程,官方也有文档和Demo,因此微信支付还是比较容易实现的. 由于我们公司是和其他公司合作运营的 ...
- leetcode - 最小移动次数使数组元素相等
思路 (假设数组每次都已被排好序) 每次使得小于等于最大值的n-1的数字加1,直接暴力求解会超时 改进一: 为了让最小元素等于最大元素,至少需要数组中最大值-最小值次, 所以以此为基础再次暴力求解(参 ...
- python解释器安装和变量配置
python解释器安装 第一步https://www.python.org/ 下载 python-3.6.6 和 python-2.7.16 俩个版本 Downloads 下 选windows版本 4 ...
- java架构之路-(设计模式)五种创建型模式之单例模式
设计模式自身一直不是很了解,但其实我们时刻都在使用这些设计模式的,java有23种设计模式和6大原则. 设计模式是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可 ...
- 主动降噪技术(ANC)的前生今世--概念历史
一 概念 假如使用一句通俗的语言来概述ANC的原理的话,那就是:通过发出与噪声相位相反,频率.振幅相同的声波与噪声干涉实现相位抵消. 使用比较正式的语言来解释就是:动降噪通过降噪系统产生与外界噪音相等 ...
- 新手学习Git之在本地使用Git
每个开发人员应该都会一个版本管理工具,在Git和SVN中,我选择以Git,以下是我的一些心得 什么是 Git Git是目前世界上最先进的分布式版本控制系统(没有之一). 一.Git安装 1).linu ...
- Java 基础篇之编程基础
基本数据类型 java 是强类型语言,在 java 中存储的数据都是有类型的,而且必须在编译时就确定其类型. 基本数据类型变量存储的是数据本身,而引用类型变量存的是数据的空间地址. 基本类型转换 自动 ...
- logcat粗略了解(一)
Logcat Logcat介绍:logcat是android的一个命令行工具,用于的到程序的log信息 Logcat命令格式: [adb] logcat [<option>]…[<f ...