首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从迭代器中获取唯一值的快速方法

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

Stack Overflow用户
提问于 2014-12-12 09:23:29
回答 2查看 2.3K关注 0票数 2

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

代码语言:javascript
复制
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

但是,当我试图从迭代器获得唯一值时,性能增益就消失了:

代码语言:javascript
复制
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,但我经常需要处理字符串)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-12 09:53:57

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

如果使用Python2,range()将创建一个列表,而xrange()则不会。这意味着:

代码语言:javascript
复制
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()并确保不要在中间创建列表是从生成器获得唯一值的最好方法(也是最重要的方法)。

票数 2
EN

Stack Overflow用户

发布于 2014-12-12 10:43:39

虽然set将保证唯一性,但它破坏了顺序,从而减少了序列的随机性,而且不能保证您的项目数量与您生成的一样多。另一种方法是首先确保生成的所有项都是唯一的,如random.sample所示

代码语言:javascript
复制
sample(xrange(10000000), 60)

这是因为xrange不仅是可迭代的,而且遵循序列协议(是可索引的和有长度的)。这个问题指的是“获取可迭代对象的唯一值”,这并不完全描述示例所做的工作。也许,如果我们知道任务是什么,也许会有一个更合适的答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27440441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档