Python字典键类型的折衷

Python字典键类型的折衷,python,dictionary,Python,Dictionary,比方说,我将用Python3为内存操作构建一个可能很大的字典。字典键是整数,但我首先要从文件中以字符串的形式读取它们 就存储和检索而言,我想知道字典键是作为整数本身还是作为字符串存储是否重要。 换句话说,将它们保留为整数有助于散列吗?实际上,字符串散列在Python 3中相当有效。我预计这会产生相反的结果: >>> timeit('d["1"];d["4"]', setup='d = {"1": 1, "4": 4}') 0.05167865302064456 >>

比方说,我将用Python3为内存操作构建一个可能很大的字典。字典键是整数,但我首先要从文件中以字符串的形式读取它们

就存储和检索而言,我想知道字典键是作为整数本身还是作为字符串存储是否重要。

换句话说,将它们保留为整数有助于散列吗?

实际上,字符串散列在Python 3中相当有效。我预计这会产生相反的结果:

>>> 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

听写速度快,但可能会占用大量内存。 通常情况下,这不应该是一个问题,但只有在测试时,您才会知道。 我建议先测试1.000行、10.000行等等,看看内存占用情况

如果内存不足且数据结构允许,可以尝试使用

(示例取自链接)


如果你有升序整数,你也可以试着通过使用来获得更多的乐趣。

你似乎没有费心对备选方案进行基准测试。事实证明,差异非常小,我也发现了不一致的差异。此外,这是一个实现细节,它是如何实现的,因为整数和字符串都是不可变的,它们可以作为指针进行比较

你应该考虑的是哪一个是关键的自然选择。例如,如果您不在其他任何地方将键解释为数字,则几乎没有理由将其转换为整数


另外,如果你想考虑键相等,如果它们的数值相同,或者它们需要在词汇上是相同的,那么你应该考虑。例如,如果你考虑<代码> 00 <代码>与代码< 0 <代码>相同的密钥,则需要将其解释为整数,然后整数是正确的密钥,如果另一方面,你想考虑它们不同,那么将它们转换成整数是完全错误的(因为它们将变得相同)。.

如果值表示整数,则将其存储为字符串而不是int有什么好处?如果您希望在任何地方都有复杂的代码,例如
my_dict[str(my_val)]
,那么这将是最好的选择。如果这些是整数,请使用
int
,无论您在文件中存储信息的方式如何。如果以后将它们用作整数,请使用整数;如果以后将它们用作字符串,请使用字符串。@poke的回答我想是最准确的
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)