簡體   English   中英

我可以為 numpy 預計算/預生成偽隨機數嗎?

[英]Can I precompute/pregenerate pseudo-random numbers for numpy?

我不認為我是第一個提出這個有點不正統的想法的人,但我似乎無法讓谷歌告訴我為什么它不好,或者如何正確地做到這一點。

我有一段受 CPU 限制的代碼,第二昂貴的 function 是np.randint(...) ,它被稱為單個數字(一次一個)。 我對程序的多次執行之間的“真實”隨機性沒有硬性要求。 因此,我認為預先計算/緩存一大堆(約 200 萬)隨機數,將它們保存在某個地方,然后讓 numpy 根據需要向我提供這些數字而不是運行 rng 可能是明智的。

有人可以告訴我為什么這是一個壞主意,或者怎么做? 謝謝!

生成您的號碼,將它們保存到文件系統並重新加載它們。 這個腳本可以幫助你嗎?

import pickle
import numpy as np

# Numbers generation
random_numbers = list(np.random.randint(0, 100, 10000))

# Save numbers
with open('filename.pickle', 'wb') as handle:
  pickle.dump(random_numbers, handle, protocol=pickle.HIGHEST_PROTOCOL)

# Load numbers
with open('filename.pickle', 'rb') as handle:
  loaded_random_numbers = pickle.load(handle)

# Check equality
print(random_numbers == loaded_random_numbers)

這是否是一個壞主意真的取決於您的應用程序(關於隨機性)。 然而生成 200 萬個隨機數並不昂貴:

numbers = np.random.randint(..., size=2_000_000)

這在我的機器上大約需要 40 毫秒。 相反,從文件加載可能會導致更長的執行時間(取決於您的文件系統和它的繁忙程度)。

因此,預先計算所有隨機數,然后一次獲取一個似乎是一個不錯的改進(實際上,調用np.random.randint 200 萬次需要大約 500 倍的時間)。 例如:

numbers = iter(np.random.randint(..., size=2_000_000))
single_number = next(numbers)

如果您無法預先計算所有數字(可能是因為您的邊界會動態變化),那么您可以使用random.randint ,它應該會更快。 然后從一次運行中保存隨機數並在下一次運行中重用它們可能是一件事。

numbers = []
numbers.append(math.randint(...))  # dynamically generate the random numbers

np.save('numbers.npy', numbers)  # eventually save the numbers

然后在下一次運行時,為了確保一定程度的變化,您可以在加載這些數字后對其進行洗牌:

numbers = np.load('numbers.npy')
np.random.shuffle(numbers)

我以前使用過它,並且像數百萬訂單的魅力一樣工作:

首先創建一個隨機數數組:

random_arr = np.random.randint(0, size=20000)

每次您需要一個隨機數時,只需使用以下方法選擇一個:

number = np.random.choice(random_arr)

它應該會顯着提高你的表現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM