![](/img/trans.png)
[英]Performance difference between numpy.random and random.random in Python
[英]Differences between numpy.random and random.random in Python
我在 Python 中有一個大腳本。 我在其他人的代碼中啟發了自己,所以我最終將numpy.random
模塊用於某些事情(例如,用於創建從二項分布中獲取的隨機數數組),在其他地方我使用模塊random.random
。
有人可以告訴我兩者之間的主要區別嗎? 查看兩者的文檔網頁,在我看來numpy.random
只是有更多方法,但我不清楚隨機數的生成有何不同。
我問的原因是因為我需要為我的主程序播種以進行調試。 但它不起作用,除非我在我正在導入的所有模塊中使用相同的隨機數生成器,這是正確的嗎?
另外,我在另一篇文章中讀到了關於不使用numpy.random.seed()
的討論,但我真的不明白為什么這是一個壞主意。 如果有人向我解釋為什么會這樣,我將不勝感激。
您已經做出了許多正確的觀察!
除非您想為兩個隨機生成器播種,否則從長遠來看,選擇一個或另一個生成器可能更簡單。 但是,如果您確實需要同時使用兩者,那么是的,您還需要同時為它們播種,因為它們彼此獨立地生成隨機數。
對於numpy.random.seed()
,主要困難在於它不是線程安全的 - 也就是說,如果您有許多不同的執行線程,使用它是不安全的,因為如果兩個不同的線程正在執行,它不能保證工作function 同時。 如果您不使用線程,並且可以合理地預期將來不需要以這種方式重寫程序,則numpy.random.seed()
應該沒問題。 如果有任何理由懷疑您將來可能需要線程,從長遠來看,按照建議進行操作會更安全,並制作numpy.random.Random
class 的本地實例。 據我所知, random.random.seed()
是線程安全的(或者至少,我沒有發現任何相反的證據)。
numpy.random
庫包含一些在科學研究中常用的額外概率分布,以及一些用於生成隨機數據 arrays 的便利函數。 random.random
庫更輕量級,如果您不進行科學研究或其他類型的統計工作,應該沒問題。
否則,它們都使用梅森捻線器序列來生成它們的隨機數,而且它們都是完全確定的——也就是說,如果你知道一些關鍵信息,就可以絕對確定地預測接下來會出現什么數字。 因此,numpy.random 和 random.random 都不適合任何嚴重的加密用途。 但是因為這個序列非常長,所以在你不擔心人們試圖對你的數據進行逆向工程的情況下,兩者都可以生成隨機數。 這也是需要播種隨機值的原因——如果你每次都從同一個地方開始,你總是會得到相同的隨機數序列!
附帶說明一下,如果您確實需要加密級別的隨機性,則應該使用secrets模塊,或者如果您使用的是早於 Python 3.6 的 Python 版本,則應使用Crypto.Random之類的東西。
From Python for Data Analysis , the module numpy.random
supplements the Python random
with functions for efficiently generating whole arrays of sample values from many kinds of probability distributions.
相比之下,Python 內置的random
模塊一次只采樣一個值,而numpy.random
可以更快地生成非常大的樣本。 使用 IPython 魔法 function %timeit
可以看到哪個模塊執行得更快:
In [1]: from random import normalvariate
In [2]: N = 1000000
In [3]: %timeit samples = [normalvariate(0, 1) for _ in xrange(N)]
1 loop, best of 3: 963 ms per loop
In [4]: %timeit np.random.normal(size=N)
10 loops, best of 3: 38.5 ms per loop
種子的來源和使用的分布配置文件將影響輸出 - 如果您正在尋找加密隨機性,來自 os.urandom() 的種子將從設備抖動(即以太網或磁盤)獲得幾乎真實的隨機字節(即 / BSD 上的開發/隨機)
這將避免您提供種子並因此生成確定性隨機數。 然而,隨機調用然后允許您將數字擬合到分布(我稱之為科學隨機性 - 最終您想要的只是隨機數的鍾形曲線分布,numpy 最擅長解決這個問題。
所以,是的,堅持使用一個發生器,但決定你想要什么隨機 - 隨機,但絕對來自分布曲線,或者在沒有量子設備的情況下盡可能隨機。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.