PHP数组实际上是一个有序映射,它将值与键相关联。随机数字索引的访问速度远远低于Java等语言。甚至Javascript数组访问也明显快于PHP。当我在服务器上编写Sudoku解决方案并最终切换到Python时,我经历了PHP的缓慢,这也比PHP快。
PHP没有提供适当的随机访问数组(对于数字索引)是什么原因?
澄清:我不是在谈论条目的随机性。我是指通过计算索引直接访问,例如拥有81个值的数组a
(数独棋盘)并直接访问任何值a[i]
而无需搜索地图。
答案 0 :(得分:3)
这只是语言设计的一个区别。很难比较“语言X”比“语言Y”更快,就像数独求解器一样。性能提升实际上归结为实现。
但是,PHP数组在内部存储为ordered hashes。
如果您正在寻找使用数组和集合的性能增益,请尝试查看these中的一些内容。它们可能更适合您的数据集。这是关于选择正确的工具 - PHP数组似乎是这种“全能”结构,人们喜欢将所有数据推入其中,这是我不同意的模式。
答案 1 :(得分:3)
也许其中一个SPL数组类型会更适合你?
编辑:仔细观察它,SplFixedArray将是数独实现的一个不错的选择,您将知道数组的大小。它说自己会更快。然而,正如其他人所说 - 没有看算法,我们怎么能确定阵列是问题?
Perfomance comparison数组vs SplFixedArray
SPL - 代表标准PHP库,它没什么可怕的
答案 2 :(得分:1)
我猜,php被设计为html页面的模板引擎。它必须非常简单,并且非常易于使用,具有典型Web应用程序所需的所有必要构造/函数,迭代数据库字段等等。
速度对于php应用程序来说从来都不是问题,因为文件系统,数据库访问和Web服务本身比php cpu处理速度慢。
答案 3 :(得分:1)
理论上,具有内部索引0 .. length - 1
的数组只是关联数组的一种特殊情况,即具有键0 .. length - 1
的关联数组。
当然查找算法更复杂,通常在最坏的情况下你不能得到O(1)。但是如果哈希函数和哈希表实现是任何好的(并且在广泛使用的语言实现中它是基本数据类型,它可能是),你确实得到了armortized O(1)。此外,当大多数或所有键都是整数时,完全有可能在哈希表的场景后面使用(非关联)数组,这在使用这些索引时排除了90%的开销。 Lua 5做到了,我不知道当前的PHP版本是否也这样做。
如果所有这些还不够并且查找对于您的目的而言仍然太慢,则另一个答案适用:改进您的算法。 (真的。不要轻易转移到其他选项。)你也可以找到一个提供一个选项的库(虽然它是否真的更快,特别是如果它是用PHP编写的)是有问题的,或者你可以将计算密集的部分移动到另一种语言(如果你需要做那,你也可以一路走下去,用C语言写)。但通常情况下,哈希表应该足够快。
答案 4 :(得分:-1)
这取决于你是如何尝试随机化的。如果你使用big for循环你不应该感到惊讶它很慢。为此目的使用rand()