如何使这些循环更快?

时间:2019-06-28 18:13:16

标签: php performance loops for-loop php4

我正在为正在处理的项目使用PHP4。我必须扩展此代码(它对手头的数据足够快地工作):

for ($i = 1; $i <= count($arr); $i++) {
$a = $arr[$i]['date'];
    for ($y = 1; $y <= 10000000; $y++) {
      $c = $arr[$i]['data'][$y];
      // here I inserted another loop
    }
}

我在其中插入了另一个循环,如下所示:

for ($k = $i + 1; $k <= count($arr); $k++) {
    $next_is_empty = false;
    $next_is_null = false;
    if ($arr[$k]['data'][$y] == '') {
        $next_is_empty = true;
        break;
    } elsif (is_null($arr[$k]['data'][$y])) {
        $next_is_null = true;
        break;
    }
}

因为我是用内存编写的,所以代码更像是一个通用概念,而不是特定的工作代码。但是,我认为我的问题足够准确。因此,我插入的这个循环在大多数情况下都可以正常工作,但在某些情况下太慢了-我该如何加快速度?我也基于此示例对性能的一般规则感到好奇。我知道最好避免嵌套循环,但是例如为什么为什么如果我将变量$next_is_empty/null放在循环前面,代码就可以足够快地工作(那么解决方案是错误的,但是足够快)?我知道它需要进行更多的重新分配,但是他们为什么要花那么多时间?

1 个答案:

答案 0 :(得分:3)

不要在循环中使用count(),将count()放在不同的行中,然后在循环中使用变量

template<template<typename,typename> class LayerT, 
         template<typename,typename> class BidirLayerT, 
         typename cell_params, 
         typename io_type>
  std::tuple<io_type, Tensor, Tensor> _lstm_impl(
      const io_type& input,
      const std::vector<cell_params>& params, 
      const Tensor& hx, 
      const Tensor& cx,
      int64_t num_layers, 
      double dropout_p, 
      bool train, 
      bool bidirectional) {
    ...
}



auto results = _lstm_impl<FullLayer, FullBidirectionalLayer>(input, params, hx[0], hx[1], num_layers, dropout_p, train, bidirectional) 

这样,基准测试效果更好

在循环外定义变量$ next_is_empty的意义是,据我所知,这很难回答,这取决于您使用的PHP版本,但最好放在外面,即原始版本。