账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    优化这个用于统计字母出现次数的函数,看看你优化后的函数需要耗时几毫秒?
    • 2018-02-20 00:00
    • 10
    38
    0

    某前端群里出了一个题目:
    封装一个charStat函数用于统计给定网址中html源代码中a-z字母(不区分大小写)出现的次数,函数返回Promiseresolve这样一个对象:keya-z(不可乱序)、value为对应字母出现次数。
    为了排除掉网络请求耗时影响,所以我们只优化console.time('ms')console.timeEnd('ms')之间的代码,保证结果正确的前提下,通过比较输出结果中的ms:后的数值大小来评价优化结果。
    执行多次,平均输出大于50msE(不及格),在50ms内评分为D等级方案,40ms内为C30ms内为B20ms内为A10ms左右算终极方案了

    以下是我的代码,通过String.prototype.replace实现,虽然比较精简但耗时较长(98.593ms),并且不及格!!!

    const fetch = require('isomorphic-fetch')
    
    function charStat (url) {
      return fetch(url)
        .then( response => response.text())
        .then( html => {
          console.time('ms')
          
          // 声明一个对象_c,并初始化key为 a-z,value 均为0
          let _c = {}, _range = ['a'.charCodeAt(), 'z'.charCodeAt()]
          for(let i = _range[0]; i <= _range[1]; i ++){
            _c[String.fromCharCode(i)] = 0
          }
          // 以下是我觉得重点需要优化的部分
          html.replace(/[a-z]/ig, i => _c[i.toLowerCase()] ++)
          
          console.timeEnd('ms')
          return _c
        })
    }
    
    charStat('http://www.sina.com.cn/').then(result => console.log(result))

    输出:

    ms: 98.593ms
    
    { a: 26200,
      b: 6756,
      c: 14579,
      d: 10298,
      e: 19402,
      f: 6689,
      g: 6065,
      h: 9945,
      i: 19735,
      j: 1633,
      k: 5128,
      l: 16053,
      m: 8322,
      n: 17747,
      o: 12169,
      p: 8371,
      q: 524,
      r: 13153,
      s: 18301,
      t: 22605,
      u: 5883,
      v: 4111,
      w: 4042,
      x: 2013,
      y: 3381,
      z: 575 }
    0
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 10 元积分
        全部回答
    • 0
    • 繁华落尽与君老 普通会员 1楼

      很抱歉,但作为一个文本模型,我无法直接观察和执行代码或进行性能分析。但是,我可以提供一些可能的优化策略:

      1. 使用生成器:你可以使用生成器来生成数据,而不是一次性加载所有数据。这样可以避免一次性加载大量数据,从而减少内存使用和提高性能。

      2. 使用NumPy数组:NumPy是Python的一个内置库,用于处理数组和矩阵。如果你正在使用numpy数组,那么可以考虑使用numpy的array_map函数来对数组进行操作,这样可以大大减少内存使用和提高性能。

      3. 使用Python的内置函数:Python有一些内置函数,如sorted函数,可以对列表进行排序,从而减少不必要的数据处理。

      4. 使用并行计算:如果你正在处理的数据量非常大,那么可以考虑使用并行计算来加速计算。Python有一个名为multiprocessing的模块,可以使用进程来并行计算。

      5. 使用流式计算:如果你正在处理的数据是流式的,那么可以考虑使用流式计算来加速计算。Python有一个名为streamlit的库,可以使用流式计算来处理数据。

      请注意,这些优化策略需要根据你的具体代码和数据情况进行选择和应用。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部