七寸殇

  • 主页
  • 随笔
所有文章 友链 关于我

七寸殇

  • 主页
  • 随笔

一次关于素数while循环的分析

2018-02-09

今天在知乎看到一个问题同为动态语言,Python 的性能为何只有 PHP 的五分之一?,本来对于打嘴仗没有兴趣,无意中看到了一段代码,是一个while循环,改动后执行速度竟然从453ms减少到了97ms,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
function isprime($num) {
$count = (int) sqrt($num);
while ($count > 1) {
if ($num % $count == 0) {
return false;
}
$count-- ;
}
return true;
}
$start = microtime(true);
for ($i = 2; $i < 100000; $i++) {
isprime($i);
}
echo (microtime(true) - $start) * 1000 ."\n";

改动后的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
function isprime($num) {
$count = (int) sqrt($num);
$i = 2;
while ($i <= $count) {
if ($num % $i == 0) {
return false;
}
$i++ ;
}
}
$start = microtime(true);
for ($i = 2; $i < 100000; $i++) {
isprime($i);
}
echo (microtime(true) - $start) * 1000 ."\n";

差别只有while部分,一个是自增,一个是自减,按道理自增和自减本身并不会有速度上的差别,那只能是while执行的次数原因了

  • 首先加一个标志$counter,while每运行一次就加1,然后查看两段代码分别计算10以内的素数的while执行次数
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #第一段代码
    $counter = 0;
    while ($count > 1) {
    $counter++;
    if ($num % $count == 0) {
    echo $counter . 's';
    return false;
    }
    echo $counter . 's';
    $count-- ;
    }

    #第二段代码
    $counter = 0;
    $i = 2;
    while ($i <= $count) {
    $counter++;
    if ($num % $i == 0) {
    echo $counter . 's';
    return false;
    }
    echo $counter . 's';
    $i++ ;
    }

执行结果如下:

正如我预料的那样,第一段代码明显运行次数较多,以18的素数来说,第一段代码执行了1次,而第二段代码执行了2次。
稍微想一下就知道了原因,18的平方根取整是4。
按照代码最多执行3次,而18明显不是素数。
这就导致了在第一段代码执行了4、3的时候发现了18不是素数,第二段代码执行到2的时候就发现了。

顺便提一句,编程语言只是工具。

赏

谢谢你请我吃糖果

支付宝
微信
  • python
  • php
  • while
  • 素数
  • 算法

扫一扫,分享到微信

微信分享二维码
如何在没有第三个变量的情况下交换两个变量的值?
nginx添加反向代理
© 2023 七寸殇
总访问量:, 页面访问量
  • 所有文章
  • 友链
  • 关于我

tag:

  • composer
  • 镜像
  • laravel
  • ab.exe
  • 性能测试
  • apache
  • 交换变量
  • 面试题
  • 位运算
  • 阿里云
  • git
  • django
  • python
  • hexo
  • blog
  • github
  • docker
  • docker-compose
  • eclipse
  • tomcat
  • 环境变量
  • requests
  • api
  • php
  • 下载完成
  • mysql
  • 数据库
  • 脏读
  • 不可重复读
  • 幻读
  • merge
  • 分支
  • 合并
  • abort
  • push
  • remote
  • pull
  • .gitignore
  • reset
  • hooks
  • redis
  • appends
  • 分页
  • paginate
  • header
  • response
  • linux
  • php7
  • nginx
  • 500错误
  • php.ini
  • display_errors
  • Auth
  • guard
  • session
  • 路由
  • route
  • validate
  • 验证
  • group_concat
  • concat
  • raw
  • 数据库查询
  • 一对多
  • 笛卡尔集
  • lnmp
  • find
  • 远程登录
  • 忘记密码
  • ThinkPHP
  • url重写
  • 路由重写
  • proxy_pass
  • 反向代理
  • foreach
  • 最后一个元素
  • get_cfg_var
  • ini_set
  • ini_get
  • ini_get_all
  • ini_restore
  • 反射
  • 类的所有方法
  • 命名规范
  • 闭包
  • 引用
  • pytesser
  • 图片识别
  • windows
  • tesseract-ocr
  • RESTful
  • 无状态
  • Statelessness
  • selenium
  • phantomjs
  • 爬虫
  • svn
  • 微信小程序
  • wxParse
  • 微信
  • 成语猜猜看
  • vagrant
  • while
  • 素数
  • 算法
  • ssh
  • setData
  • 上拉加载
  • log
  • 闲鱼
  • html

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

Make More Time