检索集中所有项的列表索引

时间:2015-07-08 11:23:46

标签: python google-app-engine numpy

我有一个非常大的,像巨大的,字典(它不是真的,但假装因为它更容易,而且不相关)一遍又一遍地包含相同的字符串。我已经证实,如果我在系统上做了穷人的压缩而存储了与字符串相对应的INT,我可以在内存中存储更多内容。

animals = ['ape','butterfly,'cat','dog']

存在于列表中,因此具有索引值,以使animals.index('cat')返回2

这允许我存储在我的对象BobsPets = set(2,3)中 而不是CatDog 对于项目数量,节省的内存是天文数字。 (真的不要试图劝阻我经过充分测试。

目前我将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及其阵列而不是列表运行一系列测试,但在此之前,我想我会问观众,看看我是否会浪费时间在我已经达到最佳状态的事情上解决方案。

最后一点,解决方案应该是可选择的,因为我这样做是为了加载和传输数据。

1 个答案:

答案 0 :(得分:0)

事实证明,由于我的字符串列表是固定的,我只希望字符串的索引,我正在构建本质上是不可变的索引数组。这就是一个元组。

转移到元组而不是列表可以使速度提高约30%。远远超过我的预期。

奖金在非常大的名单上最大。似乎每次你越过一点门槛,奖金就会增加,所以在1024分列表中,他们基本上没有奖金,而且在百万分之一的情况下,奖励非常重要。

对于相同的数据,元组也使用非常少的内存。

除了使用整数列表之外,你可以通过使用NUMPY数组使这些显着变小,但优势并不会延伸到酸洗。酱菜将增加约15%。我认为这是因为对象描述存储在pickle中,但我没有花太多时间看。

因此,简而言之,唯一的变化是让动物列表成为元组。我真的希望答案更具异国情调。