【发布时间】:2015-07-08 11:23:46
【问题描述】:
我有一个非常大的字典(它不是真的,而是假装,因为它更容易且不相关)一遍又一遍地包含相同的字符串。我已经验证,如果我在系统上进行穷人的压缩,而是存储与字符串对应的 INT,我可以在内存中存储更多。
animals = ['ape','butterfly,'cat','dog']
存在于列表中,因此有一个索引值,使得animals.index('cat') 返回2
这允许我在我的对象中存储BobsPets = set(2,3)
而不是Cat 和Dog
对于项目的数量,内存节省是天文数字。 (真的不要试图劝阻我,这是经过充分测试的。
目前我使用 FOR 循环将 INT 转换回字符串
tempWordList = set()
for IntegOfIndex in TempSet:
tempWordList.add(animals[IntegOfIndex])
return tempWordList
此代码有效。感觉“Pythonic”,但感觉应该有更好的方法。如果这很重要,我在 AppEngine 上使用 Python 2.7。这可能是因为我想知道 Numpy 是否有我错过的东西。
我的对象中有大约 250 万个事物,每个事物平均有 3 个这些“宠物”,并且有 7500 个代表宠物的 INT。 (不,它们不是真正的宠物)
我考虑过使用带有位置的字典而不是使用索引。这似乎并不快,但如果有人认为它应该是感兴趣的。 (它占用了更多的内存,并且似乎是相同的速度或非常接近)
我正在考虑使用 Numpy 及其数组而不是列表运行一堆测试,但在我这样做之前,我想我会问观众,看看我是否会浪费时间在我已经达到最好的东西上解决办法。
最后一件事,解决方案应该是可选的,因为我这样做是为了加载和传输数据。
【问题讨论】:
-
一个
set包含引用。无论它们指向字符串、整数还是返回集合本身,引用的大小都是相同的(尽管这不起作用,因为集合是可变的,因此不能将它们自己放入集合中,但你明白了)。跨度> -
将主列表移动到元组中产生的差异比我预期的要大得多。但是@jonrsharpe 为简洁起见,我没有做完整的解释,我的“集合”在这里只作为集合讨论,因为我想确保它们是独一无二的,你不必查找 INT狗六次。迁移到一个 Tuple for Animals,似乎将这部分操作加快了大约 30%。这是一个巨大的胜利。
-
如果您只是对您的代码和数据结构类似提供一个模糊的描述,我们就帮不上什么忙了。
-
jonrsharpe 问题是特定于您在唯一列表中找到项目索引的速度,以及构建该列表的最佳方式。这部分不需要我提供构成容器的自定义类和对象的非常长的代码 sn-p。因此非常清楚,“我已验证”。我不确定的部分未经过验证,例如 NUMPY 数组、元组或自定义列表上的某些变体是否可以更快。一个 Slot,或者一个 freeze dict... Frozen Dict 测试将我引向 Tuples,我没有意识到冻结列表更快。
标签: python google-app-engine numpy