2015-12-22 99 views
5

說,我將在Python 3中爲內存中操作構建一個可能很大的詞典。字典鍵是整數,但我將首先從字符串中讀取它們。Python詞典關鍵類型的權衡

就存儲和檢索而言,我想知道是否將字典鍵本身或字符串存儲爲整數。
換句話說,將它們留爲整數有助於哈希?

+0

如果它們表示整數,將值存儲爲字符串而不是int會有什麼好處?如果你想在每個地方都有像my_dict [str(my_val)]這樣複雜的代碼,這將是最好的選擇。如果這些是整數,無論​​您將信息存儲在文件中的方式如何,都使用「int」。 – Holt

+1

如果稍後將它們用作整數,則使用整數,如果稍後將它們用作字符串,請使用字符串。 – poke

+0

@poke的回答是我想最準確的 – Ramast

回答

1

其實串散列是在Python 3而高效的I預計到了相反的結果:

>>> timeit('d["1"];d["4"]', setup='d = {"1": 1, "4": 4}') 
0.05167865302064456 
>>> timeit('d[1];d[4]', setup='d = {1: 1, 4: 4}') 
0.06110116100171581 
3

日文N3 N4 N5的速度快,但可以對內存沉重。 通常情況下,它不應該是一個問題,但只有當你測試時你纔會知道。 我建議先測試1.000行,10.000行等等,並看看內存佔用情況。

如果內存不足並且數據結構允許,可以嘗試使用named tuples

EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade') 
import csv 
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))): 
    print(emp.name, emp.title) 

(從鏈接取例)

如果您的遞增整數,你也可以嘗試讓使用array module更看中。

1

你似乎沒有打擾過基準測試的選擇。事實證明,這種差異很小,我也發現不一致的差異。此外,這是一個實現細節,它是如何實現的,因爲整數和字符串都是不可變的,所以它們可以作爲指針進行比較。

你應該考慮的是哪一個是關鍵的自然選擇。例如,如果您不將密鑰解釋爲其他地方的數字,則沒有必要將其轉換爲整數。

此外,你應該考慮如果你想考慮如果他們的數字是相同的或如果他們需要在詞彙上相同的密鑰相等。例如,如果您認爲000的密鑰相同,那麼您需要將其解釋爲整數,然後整數纔是正確的密鑰,如果另一方面您想要將它們視爲不同,那麼將它們轉換爲整數將是完全錯誤的(因爲他們會變得相同)。