2015-12-22 52 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的密钥相同,那么您需要将其解释为整数,然后整数才是正确的密钥,如果另一方面您想要将它们视为不同,那么将它们转换为整数将是完全错误的(因为他们会变得相同)。