【问题标题】:Retrieve List Index for all Items in a Set检索集合中所有项目的列表索引
【发布时间】:2015-07-08 11:23:46
【问题描述】:

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

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

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

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

目前我使用 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


【解决方案1】:

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

移动到元组而不是列表的速度提高了大约 30%。远远超出我的预期。

奖金在非常大的列表中最大。似乎每次你越过一点门槛,奖金就会增加,所以在 sub 1024 列表中,他们基本上没有奖金,而在一百万的情况下,奖金是相当可观的。

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

顺便说一句,使用整数列表,您可以通过使用 NUMPY 数组使它们显着变小,但优势并没有扩展到酸洗。泡菜会大 15%。我认为这是因为对象描述存储在泡菜中,但我没有花太多时间查看。

所以简而言之,唯一的改变是使 Animals 列表成为一个元组。我真的希望答案是更奇特的。

【讨论】:

    猜你喜欢
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多