从迭代器获取唯一值的快速方法

维塔利·伊萨耶夫(Vitaly Isaev)

众所周知,迭代器显示出比普通列表理解更好的性能:

In [8]: from random import random

In [10]: %timeit [random() for i in range(10000000)]
1 loops, best of 3: 883 ms per loop

In [11]: %timeit (random() for i in range(10000000))
10 loops, best of 3: 176 ms per loop

但是,当我尝试从迭代器获取唯一值时,性能提升消失了:

In [12]: %timeit set([random() for i in range(10000000)])
1 loops, best of 3: 5.06 s per loop

In [13]: %timeit set((random() for i in range(10000000)))
1 loops, best of 3: 5.02 s per loop

我想知道是否有快速通用的方法来获取可迭代对象的唯一值?(我知道numpy.unique,但是我经常必须使用字符串)。

皮埃尔

正如@georg所提到的,[11]因为它实际上什么都不做,所以速度很快。

如果您使用的是Python 2,则range()创建一个列表,而xrange()不会。这给出了:

In [1]: from random import random

In [2]: timeit set([random() for i in xrange(10000000)])
1 loops, best of 3: 6.11 s per loop

In [3]: timeit set(random() for i in xrange(10000000))
1 loops, best of 3: 5.61 s per loop

这显示了一点时间收益。无论如何,[3]超过的主要增益[2]当然是内存增益。

要回答您的问题,使用set()并确保不要在两者之间创建列表是从生成器获取唯一值的最佳(也是最Pythonic的)方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用遮罩获取唯一的数组值

来自分类Dev

Perl从文件列获取唯一值

来自分类Dev

如何获取UInt64,toString唯一值的方法?

来自分类Dev

遍历角度控制器中的嵌套json数组并获取唯一值

来自分类Dev

从迭代器获取唯一值的快速方法

来自分类Dev

如何获取唯一ID和唯一值的列名

来自分类Dev

迭代器产生唯一的随机顺序?

来自分类Dev

克服HashMap中的快速失败迭代器的方法

来自分类Dev

从字符向量获取近似唯一值

来自分类Dev

如何快速获取数组中对象的唯一ID

来自分类Dev

获取Javascript数组的唯一值

来自分类Dev

一维数组的唯一值,无需迭代

来自分类Dev

从对象数组获取唯一值

来自分类Dev

迭代熊猫中唯一值的更快方法?

来自分类Dev

SQL获取唯一值的计数

来自分类Dev

在集合字典中获取唯一值

来自分类Dev

Perl从文件列获取唯一值

来自分类Dev

获取范围之外的唯一值

来自分类Dev

如何获取UInt64,toString唯一值的方法?

来自分类Dev

如何使jmeter从每次迭代的响应中选择唯一值

来自分类Dev

从列表中获取唯一值

来自分类Dev

如何快速获取数组中对象的唯一ID

来自分类Dev

从数组获取唯一值

来自分类Dev

从快速迭代添加时,如何使解析服务器条目保持唯一?

来自分类Dev

迭代并从JSON中获取一些索引的唯一值

来自分类Dev

使用查询构建器连接从多个表中获取唯一值

来自分类Dev

如何在db查询构建器中分组以获取唯一值?

来自分类Dev

快速从大文件中获取唯一记录

来自分类Dev

熊猫唯一值如何作为起点进行迭代