【问题标题】:Erlang: lists:keyfind/3 vs dict:from_list/1 + dict:fetch/2 or dict:find/2Erlang:lists:keyfind/3 vs dict:from_list/1 + dict:fetch/2 或 dict:find/2
【发布时间】:2012-11-27 14:12:50
【问题描述】:

如果我有一个键值元组列表,例如List = [{key1, value1}, {key2, value2}] 是不是更好用

lists:keyfind(Key, N, TupleList) 例如列表:keyfind(key1, 1, List)

找到一个给定的值或

dict:from_list(列表)

把它变成一个字典,然后用 dict:fetch/2 或 dict:find/2 查找?

使用 dict 对我来说更具可读性,因为它直接返回值,因此我可以内联使用它,但我想知道哪个更有效?

谢谢。

【问题讨论】:

  • 扫描列表很可能更快。除非您要多次执行此操作,否则将其转换为 dict 一次会更好。为什么不一直使用dict 而不是列表。如果你想要一个列表,另一种方法是使用orddict,它保留一个有序列表并提供与dict相同的接口。

标签: list dictionary erlang


【解决方案1】:

您还可以选择使用 proplists:lookup(),它是 stdlib 的一部分,并且务实地是表达您正在做的事情的最惯用的方式。您将以原始形式操纵结构,您的程序员同行会为此感谢您。从下面的链接中可以看出,就效率而言,遍历列表直到找到匹配项,任何进一步出现的键都将被忽略。

proplists.erl

lists:keyfind() 的使用可能是另一个不那么惯用的选项,因此在我看来,在保持与使用结构作为 proplist 的一致性方面失去了观点。 lists:keyfind() 是一个 BIF,它只告诉我们用 C 实现并不一定是因为效率,而是很有可能。

最后,在我看来,使用列表进行 dict 并没有让您利用可读性,并且您将失去数据结构最初构思方式的一致性,与其他两个相比可能效率较低,因为您遍历列表将其转换为 dict,然后使用 dict 接口查找结构,所以在我看来,你是在失去而不是获得。

我的两分钱!

【讨论】:

  • 有趣的是,我没有遇到过 proplists。在没有字典的情况下,这似乎是一种更清晰的方式。您认为没有必要再遍历列表来创建字典的论点也很有说服力。
  • 关于 proplists 与 keyfind,请在以下博客条目中查看我的 cmets:ostinelli.net/erlang-listskeyfind-or-proplistsget_value
猜你喜欢
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-10
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多