更有效地使用词典

时间:2015-12-12 01:16:57

标签: python dictionary

我将以10,000个证券的顺序存储X 300个日期对X 2在某些缓存机制中的类型。

我假设我要使用字典。

问题第1部分:

哪个更有效还是更快?假设我一般都在查找安全ID列表和2个日期加上类型。如果通过调整查找来提高效率,我很乐意这样做。还假设我在一定程度上浪费了记忆。

方法1:使用看起来像字符串的键来存储和查找" securityID_date1_date2_type"

方法2:使用看起来像元组的键(securityID,date1,date2,type)来存储和查找

方法3:使用方法1和2中提到的某些变体的嵌套字典存储和查找

问题第2部分:

有一个简单而更好的方法吗?

1 个答案:

答案 0 :(得分:0)

这将取决于您的用例。查找是唯一的活动,还是会做其他事情,例如:

  1. 迭代所有键/值?为简单起见,如果迭代相对常见,则不希望嵌套字典。
  2. 如何使用给定的securityIDtype等来迭代密钥子集?如果您需要使用一个具有给定值的组件迭代“键”,嵌套词典(每个键都键入键的一个或多个组件)将是有益的。
  3. 如果需要根据关键组件的不同子集进行迭代,该怎么办?如果是这样的话,普通dict可能不是最好的主意;您可能需要关系数据库,内置sqlite3 module或第三方模块以获得更多“生产级”DBMS。
  4. 除此之外,构建和使用密钥的方法也很重要。字符串缓存它们的哈希代码(并且可以实现更快速的比较),因此如果您重复使用字符串进行查找而将其存储在其他位置,那么它将会很快。但是tuple s通常更安全(如果字符串中的组件之间的分离得不到很好维护,则由多个部分构造的字符串可能会意外地从不同的键生成相同的字符串)。您可以轻松地从tuple恢复原始组件,其中需要解析字符串以恢复值。在简单的查找速度竞赛中,嵌套的dict不太可能获胜(并且需要使用setdefault等方法进行正确填充的一些技巧),因此只有在迭代数据的子集时才能获得关键的单个组成部分,它们可能是有益的。

    如果您想进行基准测试,我建议使用示例数据填充dict,然后使用timeit模块(或ipython的{​​{1}}魔法)来测试一些近似于你的用例的东西。只要确保这是一个公平的测试,例如不要每次都查找相同的密钥(使用%timeit重复几百个密钥可以更好地工作),因为itertools.cycle优化了该方案,并确保每次都构造密钥,而不仅仅是重用(除非重用在实际场景中很常见),因此字符串的哈希码缓存不会干扰。