2009-10-16 78 views
6

我想在python中創建一個約200,000,000個真/假值集合的對象。這樣我就可以最有效地改變或回想任何給定的真/假值,這樣我就可以快速確定任何給定的數字,如123,456,000是真還是假,或者是否改變了它的值。Python中極大的布爾值列表

是做這個清單的最好方法嗎?或數組?或一個班?或只是一個長的int使用位操作?或者是其他東西?

我有點小白,所以你可能要多,如果我被問的問題在我更好地瞭解其他語言的拼寫一個東西出來給我。請給我一些關於如何操作這個對象的例子。

謝謝

+3

真/假值是密集還是稀疏?它們是均勻分佈的,還是它們可能更密集和更稀疏?數據結構的理想選擇取決於這些。當然你可能不需要「理想」。 – Steve314 2009-10-16 19:47:30

回答

12

您可以使用整數自己的array嘗試bitarray模塊,或者寫一個類似的事情。

+0

謝謝!我以前從未安裝過模塊,但遇到了一些麻煩:http://superuser.com/questions/56316/python-module-trouble-installing-bitarray – Dan 2009-10-16 19:45:03

3

你有沒有考慮過使用像SQLite這樣的輕量級數據庫?

+4

+1。2億比特大約有24兆字節的數據 - 儘管這可以很容易地適應現代機器的內存,但只要你在內存中達到這種結構的大小,你可能至少需要考慮一個數據庫是否是更好的解決方案。 – 2009-10-16 19:29:27

4

「快速確定是否有任何給定的數字,比如123456000是」中設置的「真」或「假」集。

這是一個set是。

「真」集是一組所有數字。

要將數字的布爾標誌設置爲「真」,請將其添加到真集中。

爲了使數字的布爾標誌「假」,從真正的設定中刪除。

生活會更簡單。

+1

+1:使用簡單,可能足夠有效的稀疏列表 – jfs 2009-10-16 22:58:54

+0

假設一半的值是真實的。 int對象的大小是12個字節,即1.2GB只是用於存儲密鑰+實際哈希表的額外內存。使用位數組,內存使用量將爲25MB。我認爲這是一個重大的差異。 – 2009-10-17 07:03:13

+0

@LukášLalinský:你的分析很好。但是,除非您的處理器沒有可用內存,否則我認爲它不相關。在大多數現代處理器上,有很多內存,而25M和1.2G並不是真的很重要。 – 2009-10-17 12:05:27

1

乍看之下,Python BitVector模塊聽起來像它正是你想要的。它可以在http://cobweb.ecn.purdue.edu/~kak/dist/BitVector-1.5.1.html獲得,由於它是純Python代碼,它可以在任何平臺上運行,無需編譯。

你提到你需要一些速度來獲取和設置任意的真假值。爲此,您需要使用Python數組而不是列表,並且如果您轉到上面的URL並瀏覽BitVector的源代碼,則可以看到它確實依賴於Python數組。

理想情況下,你會封裝你正在做的,從位向量的子類一類的東西,即

class TFValues(BitVector): 
    pass 

這樣,你可以不喜歡的東西添加列表包含相關的信息,如特定的名稱TF值。

3

您也可能想嘗試的bitstring模塊,它是純Python。在內部它的所有存儲爲一個字節數組,該位掩碼和移位爲你做:

from bitstring import BitArray 
# Initialise with two hundred million zero bits 
s = BitArray(200000000) 
# Set a few bits to 1 
s.set(1, [76, 33, 123456000]) 
# And test them 
if s.all([33, 76, 123456000]): 
    pass 

其他海報是正確的,雖然是一組簡單的可能是一個更好的解決您的具體問題。