我要生成使用PHP億個整數,但我的代碼太慢運行:生成億個隨機整數有效
<?php
$arr=array();
while(count($arr)<10000)
{
$arr[]=rand(1,10000);
$arr=array_unique($arr);
}
echo implode(" ",$arr);
?>
我怎麼可能提高呢?
我要生成使用PHP億個整數,但我的代碼太慢運行:生成億個隨機整數有效
<?php
$arr=array();
while(count($arr)<10000)
{
$arr[]=rand(1,10000);
$arr=array_unique($arr);
}
echo implode(" ",$arr);
?>
我怎麼可能提高呢?
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
:在21 seconds
與550M
一個memory_limit
ini_set('memory_limit', '7G');
$arr = array();
while(count($arr) < 100000000)
{
$num = rand(1, 100000000);
$arr[$num] = $num;
}
下運行(更何況,並將其與致命錯誤去世了內存)。只有10,000
它運行在.0005 seconds
並且不需要高於我的默認值128M
的內存。
讓PHP爲你創建一個範圍(唯一),然後洗牌(隨機化)。現在你有一個隨機的順序所有的號碼,而無需生成它們一個接一個,消除重複併產生更多:
ini_set('memory_limit', '550M');
$arr = range(1, 10000000);
shuffle($arr);
謝謝,這對我很有幫助 – HAO
我不能讓它跑,疲憊不堪內存即使我增加memory_limit,但'$ arr = range(1,100000000); shuffle($ arr);' – AbraCadaver
@AbraCadaver自己也得出同樣的結論。我嘗試了高達1,000,000,但更多零點吹響了記憶。當然,它在短時間內完成了這項工作。你應該評論一個答案。 – Manngo
也許這個數字太多了,我編輯它,我怎麼能改進它? – HAO