一个多维数组和多个单维数组哪个更好?

4

我正在进行一个项目,需要在PHP中对数据数组执行计算。其中一些计算涉及与多个数组一起工作。所有数组的长度(count)都相同。

问题:将数据放入多维数组中还是保留在两个数组中更有效(内存和处理器使用)?

请记住,其中一些数组可能有数千个值。

示例:为了更好地说明问题,这里有一个数据和用法的示例:

X = 1,2,3,4,5

Y = 2,3,3,4,4

计算X和Y之间的相关性。

要做到这一点:

  1. 从列中获取X和Y的总和
  2. 从列中获取X^2和Y^2的总和
  3. 然后使用相关性公式进行计算

我的想法: 将两个数组合并成一个多维数组可以减少计算次数,但首先需要将它们组合起来。

所以我提出的主要问题和原因是创建一个多维数组并对其进行1次迭代是否需要更少的资源,还是保持它们分开并对每个数组进行迭代 - 进行2次迭代更好。

或者是否有更好的方法可以在数组上执行计算而不涉及迭代?


3
在 PHP 中过分担心 CPU 和内存效率是不可取的。如果您的数组变得足够大以至于这成为一个问题,那么您就不应该再使用 PHP。话虽如此,答案取决于您最具约束力的资源是什么:CPU 还是内存。很可能您还远未达到任何一个限制,因此没有必要担心它。 - user229044
这个项目使用RackSpace云,因此我会为CPU周期(处理器时间和磁盘I/O的集合)付费 - 每月基础费用为10,000。因此,我希望尽量减少应用程序使用的资源量。希望它能保持在此限制以下,但有些数组很大。 - Todd Moses
5个回答

3
如果您已经有两个单独的数组作为数据,那么首先合并它们将是一种浪费时间和资源的做法,我想。
PHP中有两种形式的数组访问,迭代访问使用内部指针,按顺序访问,通过关联键/索引访问则是哈希映射而非顺序。如果您要查看数组的所有元素,并且可能按顺序这样做,则尝试使用内置array_函数或迭代器函数reset()、next()、cur()、end()、each()进行迭代访问。
请查看PHP中array_reduce()函数,它可以帮助您快速实现这种类型的操作。虽然在这个简单的案例中,您最好使用一个for()循环直接使用数组迭代器函数reset()、next()、cur()来获取每个数组中的值 - 或者如果它们被标识为相同的,则可以执行foreach()并使用一个数组的键来处理另一个数组。
$sum_x = array_reduce($x, create_function('$x1,$x2', 'return $x1 + $x2;'), 0);
$sum_y = array_reduce($y, create_function('$y1,$y2', 'return $y1 + $y2;'), 0);
$sum_x2 = array_reduce($x, create_function('$x1,$x2', 'return $x1 + $x2 * $x2;'), 0);
$sum_y2 = array_reduce($y, create_function('$y1,$y2', 'return $y1 + $y2 * $y2;'), 0);

或者

$sum_x = 0;
$sum_y = 0;
$sum_x2 = 0;
$sum_y2 = 0;

foreach (array_keys($x) as $i) {
  $sum_x += $x[$i];
  $sum_y += $y[$i];
  $sum_x2 += $x[$i] * $x[$i];
  $sum_y2 += $y[$i] * $y[$i];
}

数组方法及其回调函数确实非常有用 - 我经常使用它们。特别是array_map()。作为一个习惯于函数式语言如F#、Haskell、JS(至少是jQuery)的程序员,我习惯于在内联中使用匿名函数,因此create_function()很有帮助。 - Orbling
谢谢。这非常有帮助。 - Todd Moses

1
考虑到PHP中所有的数组都是哈希表且关联数组,我认为最大的性能提升应该是减少迭代次数。我会使用多维数组。

1
PHP确实将所有数组存储为关联数组,但它们都有一个内部排序,与关联索引分开。因此,如果您通过数组迭代器顺序处理数组,那么比任何关联查找都要快。 - Orbling

1

谢谢。在我构建核心部分之后,我很可能会做这个。 - Todd Moses

1

这不是特定于PHP的。引用的局部性通常很重要,因为缓存未命中很昂贵。

例如,如果您正在处理并行数组中的项目(全部? 1,然后全部? 2 ...),则更有效地将它们组织在内存中:

A1 B1 C1 ... A2 B2 C2 ... A3 B3 C3 ...

不要使用典型的:

A1 A2 A3 ... B1 B2 B3 ... C1 C2 C3 ...

当然,这取决于您具体的计算。将数据加载到第一个布局中可能需要相当长的时间。最终,分析是确保正确性的唯一途径。

0

我看不出在处理器或内存方面,二维数组和两个一维数组之间会有任何区别。应该使用相同数量的内存。它们都将具有相同数量的元素吗?


这也是我的第一反应。但根据数组在迭代中的存储和访问方式,这并不一定是真的。 - Todd Moses

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接