我正在为正在处理的项目使用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
放在循环前面,代码就可以足够快地工作(那么解决方案是错误的,但是足够快)?我知道它需要进行更多的重新分配,但是他们为什么要花那么多时间?
答案 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版本,但最好放在外面,即原始版本。