count()
是否确实计算了PHP数组的所有元素,还是将此值缓存到某处并仅检索?对于数组,PHP的count()函数是O(1)还是O(n)?
回答
好了,我们可以看看源:
/ext/standard/array.c
PHP_FUNCTION(count)
电话php_count_recursive()
,这反过来又非递归阵列,这是这种方式实现来电zend_hash_num_elements()
:
ZEND_API int zend_hash_num_elements(const HashTable *ht)
{
IS_CONSISTENT(ht);
return ht->nNumOfElements;
}
所以你可以看到,它的为。
在PHP 5+中,长度存储在数组中,因此每次都不会进行计数。
编辑:你也可能会发现这个分析有趣:PHP Count Performance。虽然阵列的长度由阵列维护,但如果您打算多次呼叫count()
,似乎仍然保持较快。
我认为你可能是正确的,从PHP 5开始的变化。 但是,我还没有找到证明PHP 4是O(n)count();我只看到轶事评论。你能找到证明(例如PHP 4的count()实现)吗?谢谢, – 2016-01-16 00:46:06
PHP在内部存储数组的大小,但是如果你正在做一些类似的事情时,你仍然在做一个函数调用,哪一个比不做一个调用要慢,所以你需要将结果存储在一个变量中在循环中使用它:
例如,
$cnt = count($array);
for ($i =0; $i < $cnt; $i++) {
foo($array[$i]);
}
此外,你不能始终确保count
被称为阵列上。例如,如果在实现Countable
的对象上调用该对象,则将调用该对象的count
方法。
作为一个后续行动,你可能想要阅读http://josephscott.org/archives/2010/01/php-count-performance/它基本上详细说明如何获得数组长度为o(1)以及重复的函数调用。 – TheClair 2011-04-29 17:32:51
正在做一个函数调用总是比不做一个更慢?我不会惊讶地发现解释器有内联优化。 – corsiKa 2011-04-29 17:34:11
'这个对象的计数方法将被称为',如果一个类实现了'Countable'接口,然后调用'count($ object)'和调用'$是同一件事的话,你可以这样解释一下 – 2014-08-02 09:09:40
- 1. 下面的函数是O(n)时间和O(1)空间,其中n = | A |?
- 2. 我应该考虑memmove()O(n)还是O(1)?
- 3. 是string.ElementAt()O(1)?
- 4. 为什么这个函数/循环O(log n)而不是O(n)?
- 5. 是C++语句的大-O'delete [] Q;' O(1)或O(n)?
- 6. 复杂度O(log(n))是否等于O(sqrt(n))?
- 7. 大O符号 - O(n日志(N))对O(的log(n^2))
- 8. 是log(n!)= O((log(n))^ 2)?
- 9. O(n^2)中是O(mn)吗?
- 10. 这是用于计算数组O(n)复数中的倒数的算法吗?
- 11. 计数no。 O(n)
- 12. 不应插入O(n)而不是O(1)或O(n)插入未排序的链表中?
- 13. 这个函数对于大O的内存需求是什么?
- 14. 对于一些常数c,阶乘(floor(log(n)))是大O(n^c)吗?
- 15. 证明最大(O(f(n)),O(g(n)))= O(max(f(n),g(n))
- 16. 为什么两个O(N)方法被认为是O(N)?
- 17. 为什么TreeSet迭代O(n)而不是O(n * logn)?
- 18. 堆性能低下。 O(n)而不是\t O(日志n)
- 19. 如果只有从1到n的元素,是否可以对O(n)中的数组进行排序?
- 20. 在o(1)中访问数组的第n个索引
- 21. 两次通过数组为O(n)或O(2N)
- 22. 是O(LogN)== O(3LogN)?
- 23. 如何使这个空间复杂度为O(1)而不是O(n)?
- 24. Php:方括号添加函数有多少复杂性[即O(N),O(1),...]?即$ X [] =“值”
- 25. O(nlog * n)和O(n)之间?
- 26. 找到O(1)的空间和O(n)的时间
- 27. 给出一个简单的函数,使得和S(n)是O(f(n))?
- 28. 在Python中嵌套的memcache查找,o(n)好还是不好?
- 29. 为什么从O(1)调度程序到O(log N)的CFS?
- 30. 数组访问总是恒定时间/ O(1)?
为什么不测试它?它足够简单,可以做一个循环,将元素添加到数组中并每次计算并执行一些计时。 – 2011-04-29 17:26:47
看看这个问题:http://stackoverflow.com/questions/2473989/list-of-big-o-for-php-functions – 2011-04-29 17:29:25
谷歌关键字 - 这个问题也可以表述为:PHP count()迭代数组还是从数组属性检索计数? – 2015-09-01 12:07:41