说,我将在Python 3中为内存操作构建一个可能很大的字典。字典键是整数,但我首先要从文件中读取它们。
就存储和检索而言,我想知道是否将字典键存储为整数本身或字符串是否重要。
换句话说,将它们作为整数留下来帮助散列吗?
答案 0 :(得分:3)
Dicts很快,但内存很重。 通常它不应该是一个问题,但你只会知道你何时测试。 我建议先测试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 :(得分:1)
实际上,字符串哈希在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
答案 2 :(得分:1)
你似乎没有打扰替代品的基准测试。事实证明,差异非常小,我也发现不一致的差异。此外,这是一个实现细节,它是如何实现的,因为整数和字符串都是不可变的,它们可以作为指针进行比较。
你应该考虑哪一个是关键的自然选择。例如,如果您没有将密钥解释为其他任何地方的数字,那么将其转换为整数的理由就不多了。
此外,如果您的数值相同或者它们需要在词法上相同,您应该考虑是否要考虑相等的键。例如,如果您将00
考虑为与0
相同的密钥,则需要将其解释为整数,然后整数是正确的密钥,如果另一方面您想要将它们视为不同,那么它会将它们转换为整数是完全错误的(因为它们会变得相同)。