我想使用PHP生成一亿个整数,但我的代码运行速度太慢了:
<?php
$arr=array();
while(count($arr)<10000)
{
$arr[]=rand(1,10000);
$arr=array_unique($arr);
}
echo implode(" ",$arr);
?>
我如何改进它?
答案 0 :(得分:0)
100,000,000
数字非常雄心勃勃而且不太现实,我的计算机(英特尔酷睿i5-3320M 2.6GHz,8GB内存,Windows 7 64位)和PHP 7.1.3(应该是多少)内存比5.x更好,你的循环在我杀死之前跑了大约8 hours
。只有10,000
,它会在1596 seconds
中运行,即27 minutes
。
除了迭代次数之外,主要问题是array_unique()
。每次迭代都需要花费一些时间才能在不断增加的有时很大的数组上运行,并且可能会删除需要重新生成的项目。
我尝试了一种更好的方法,使用数字作为关键来避免重复。使用memory_limit
7G
(更少,并且因致命错误内存而死亡),它会在1018 seconds
中运行,即17 minutes
。只有10,000
,它会在.0035 seconds
中运行:
ini_set('memory_limit', '7G');
$arr = array();
while(count($arr) < 100000000)
{
$num = rand(1, 100000000);
$arr[$num] = $num;
}
以下21 seconds
memory_limit
550M
10,000
运行(更少,并且因内存不足致命错误而死亡)。只有.0005 seconds
,它在128M
中运行,并且不需要超出我的默认值ini_set('memory_limit', '550M');
$arr = range(1, 10000000);
shuffle($arr);
的内存。
让PHP为您创建一个范围(唯一),然后将其随机化(随机化)。现在,您可以按随机顺序获取所有数字,而无需逐个生成它们,消除重复数据并生成更多数据:
{{1}}