【发布时间】:2017-05-11 02:06:04
【问题描述】:
我需要一个有效的结构来存储数千个相同类型的元素,并且能够进行随机访问。
虽然列表在迭代和前置方面效率最高,但随机访问速度太慢,因此不符合我的需求。
地图效果更好。但是,它会导致一些开销,因为它适用于键可能是任何东西的键值对,而我需要一个索引从 0 到 N 的数组。因此,我的应用程序在地图上的运行速度太慢。对于像处理随机访问的有序列表这样简单的任务,我认为这是不可接受的开销。
我发现元组是 Elixir 中对我的任务最有效的结构。与我机器上的地图相比,它更快
- 迭代时 - 1_000 为 1.02x,1_000_000 元素为 1.13x
- 关于随机访问 - 1_000 为 1.68x,1_000_000 为 2.48x
- 在复制时 - 1_000 为 2.82x,1_000_000 为 6.37x。
因此,我在元组上的代码比在地图上的相同代码快 5 倍。它可能不需要解释为什么 tuple 比 map 更有效。目的达到了,但是大家都说“不要对相似元素的列表使用元组”,没有人能解释这个规则(这种情况的例子https://stackoverflow.com/a/31193180/5796559)。
顺便说一句,Python 中有元组。它们也是不可变的,但仍然是可迭代的。
所以,
1.为什么元组在 Elixir 中不可枚举?有任何技术或逻辑限制吗?
2.为什么我不应该将它们用作相似元素的列表?有什么缺点吗?
请注意:问题是“为什么”,而不是“如何”。上面的解释只是一个例子,元组比列表和映射更好。
【问题讨论】:
-
我不同意“不要将元组用于相似元素的列表”。你有链接到有人说这个吗?也许上下文不同?我过去使用过元组,我希望通过索引快速随机访问列表(与您的用例相同),这对我的用例来说是一个巨大的加速,因为索引变为 O(1) 而不是 O(n)。
-
@KeithA 那篇文章没有回答我的问题。
-
@Dogbert KeithA 上面发布的链接包含这样的例子,人们说“元组不应该被迭代”。否则为什么它们不可枚举?顺便说一句,您还可以通过用地图替换列表来实现巨大的加速。
-
@Ninigi 我对大约 100_000 个元素进行随机访问。这种长度的列表比随机访问的元组慢 3700 倍。所以我什至不尝试使用列表。我已经尝试过比我的任务慢 5 倍的地图。我还没有尝试过 :array ,但它在 Elixir 中也是不可枚举的,所以用 :array 替换元组对代码可读性没有意义。
标签: arrays performance tuples elixir enumerable