我有一个非常大的,像巨大的,字典(它不是真的,但假装因为它更容易,而且不相关)一遍又一遍地包含相同的字符串。我已经证实,如果我在系统上做了穷人的压缩而存储了与字符串相对应的INT,我可以在内存中存储更多内容。
animals = ['ape','butterfly,'cat','dog']
存在于列表中,因此具有索引值,以使animals.index('cat')
返回2
这允许我存储在我的对象BobsPets = set(2,3)
中
而不是Cat
和Dog
对于项目数量,节省的内存是天文数字。 (真的不要试图劝阻我经过充分测试。
目前我将INT转换回带有FOR循环的字符串
tempWordList = set()
for IntegOfIndex in TempSet:
tempWordList.add(animals[IntegOfIndex])
return tempWordList
此代码有效。它感觉“Pythonic”,但感觉应该有更好的方式。如果重要的话,我在AppEngine上使用Python 2.7。可能因为我不知道Numpy是否有我错过的东西。
我的物体中有大约250万个物品,每个物品平均有3个“宠物”,还有7500个iss INT代表宠物。 (不,他们不是真正的宠物)
我考虑过使用位置而不是使用Index。这似乎并不快,但如果有人认为它应该是有兴趣的话。 (它花了更多的记忆,似乎是相同的速度或非常接近)
我正在考虑用Numpy及其阵列而不是列表运行一系列测试,但在此之前,我想我会问观众,看看我是否会浪费时间在我已经达到最佳状态的事情上解决方案。
最后一点,解决方案应该是可选择的,因为我这样做是为了加载和传输数据。
答案 0 :(得分:0)
事实证明,由于我的字符串列表是固定的,我只希望字符串的索引,我正在构建本质上是不可变的索引数组。这就是一个元组。
转移到元组而不是列表可以使速度提高约30%。远远超过我的预期。
奖金在非常大的名单上最大。似乎每次你越过一点门槛,奖金就会增加,所以在1024分列表中,他们基本上没有奖金,而且在百万分之一的情况下,奖励非常重要。
对于相同的数据,元组也使用非常少的内存。
除了使用整数列表之外,你可以通过使用NUMPY数组使这些显着变小,但优势并不会延伸到酸洗。酱菜将增加约15%。我认为这是因为对象描述存储在pickle中,但我没有花太多时间看。
因此,简而言之,唯一的变化是让动物列表成为元组。我真的希望答案更具异国情调。