Python 如何以最佳方式存储50万个键值对?

Python 如何以最佳方式存储50万个键值对?,python,Python,所以,我有一个附加了ID的对象。我需要在那个ID上做一个查找,然后得到一个不同的ID。我只是不知道最有效的方法 本质上,转换将如下所示: 1 -> af567 2 -> at678 3 -> dh675 我将在Python中进行查找,所有这些值在运行前都是已知的。我考虑过Json、SQLite或预构建的字典,但我不确定采取哪种最佳路线。将存储500000对这样的数据。我只需要知道存储这些对的最佳介质好的,那么你有500.000个项目,其中一个数字映射到一个五位数的字符串: 让

所以,我有一个附加了ID的对象。我需要在那个ID上做一个查找,然后得到一个不同的ID。我只是不知道最有效的方法

本质上,转换将如下所示:

1 -> af567
2 -> at678
3 -> dh675

我将在Python中进行查找,所有这些值在运行前都是已知的。我考虑过Json、SQLite或预构建的字典,但我不确定采取哪种最佳路线。将存储500000对这样的数据。我只需要知道存储这些对的最佳介质

好的,那么你有500.000个项目,其中一个数字映射到一个五位数的字符串:

让我们来测试一下

def five(i):
    """turns a number into an at least five-digit string"""
    s = hex(s).replace('0x', '')
    return '0' * (5 - len(s)) + s

# 500k items, no duplication
d = {}
for i in range(500000):
    d[i] = five(i)

# see https://code.activestate.com/recipes/577504/
total_size(d, verbose=False) / 1024 / 1024
# => 33.8720645904541 (megabytes)

那没什么,真的。使用dict.

好的,这样您就有了500.000个项目,其中一个数字映射到一个五位数的字符串:

让我们来测试一下

def five(i):
    """turns a number into an at least five-digit string"""
    s = hex(s).replace('0x', '')
    return '0' * (5 - len(s)) + s

# 500k items, no duplication
d = {}
for i in range(500000):
    d[i] = five(i)

# see https://code.activestate.com/recipes/577504/
total_size(d, verbose=False) / 1024 / 1024
# => 33.8720645904541 (megabytes)


那没什么,真的。使用口述。

你试过什么了吗?你知道这是你的瓶颈吗?500k并没有那么多…有一个用于键值对的内置数据结构,您可能想试试。我打赌会有一个dict@Aaron不,在我开始尝试之前,我想我应该先放弃一个问题。我不需要疯狂的优化,比如如果一个查找需要0.1秒而不是15秒,那就好了。我只是担心它是.1秒还是2秒,或者其他什么。如果你开始在
dict
中遇到内存问题,你可以使用内存映射数组或
struct
库玩一些游戏,但是500k并不是很多,特别是当你的键和值只有几个字节时。。为此,字典将有固定的时间查找,并且将比数据库快得多。你试过什么了吗?你知道这是你的瓶颈吗?500k并没有那么多…有一个用于键值对的内置数据结构,您可能想试试。我打赌会有一个dict@Aaron不,在我开始尝试之前,我想我应该先放弃一个问题。我不需要疯狂的优化,比如如果一个查找需要0.1秒而不是15秒,那就好了。我只是担心它是.1秒还是2秒,或者其他什么。如果你开始在
dict
中遇到内存问题,你可以使用内存映射数组或
struct
库玩一些游戏,但是500k并不是很多,特别是当你的键和值只有几个字节时。。为此,字典将有固定的时间查找,并且将比数据库快得多。公平地说,
getsizeof
只返回容器的大小,而不返回它包含的对象……你是对的,我没有想到这一点。以递归方式计算,这将达到35MB。还是没什么好担心的。我将更新我的答案。例如,它将考虑Python字符串对象的指针,而不是字符串对象本身的内存(许多小字符串可能需要大量内存,因为它们会导致Python对象的全部开销),谢谢!能够使用字典而不是数据库会简单得多,所以我很高兴您能让我轻松地考虑可能的效率问题,在您的机器上进行测试,看看是否有任何巨大的差异。使用真实数据。请注意,自从我最初发布我的答案以来,我已经更新了一点。使用linked函数计算对象大小。公平地说,
getsizeof
只返回容器的大小,而不是它包含的对象……你说得对,我没有想到这一点。以递归方式计算,这将达到35MB。还是没什么好担心的。我将更新我的答案。例如,它将考虑Python字符串对象的指针,而不是字符串对象本身的内存(许多小字符串可能需要大量内存,因为它们会导致Python对象的全部开销),谢谢!能够使用字典而不是数据库会简单得多,所以我很高兴您能让我轻松地考虑可能的效率问题,在您的机器上进行测试,看看是否有任何巨大的差异。使用真实数据。请注意,自从我最初发布我的答案以来,我已经更新了一点。使用链接函数计算对象大小。