众所周知,迭代器比一般的列表理解显示出更好的性能:
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,但我经常需要处理字符串)。
发布于 2014-12-12 09:53:57
正如@georg [11]所提到的那样,它速度很快,因为它实际上什么也不做。
如果使用Python2,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()并确保不要在中间创建列表是从生成器获得唯一值的最好方法(也是最重要的方法)。
发布于 2014-12-12 10:43:39
虽然set将保证唯一性,但它破坏了顺序,从而减少了序列的随机性,而且不能保证您的项目数量与您生成的一样多。另一种方法是首先确保生成的所有项都是唯一的,如random.sample所示
sample(xrange(10000000), 60)这是因为xrange不仅是可迭代的,而且遵循序列协议(是可索引的和有长度的)。这个问题指的是“获取可迭代对象的唯一值”,这并不完全描述示例所做的工作。也许,如果我们知道任务是什么,也许会有一个更合适的答案。
https://stackoverflow.com/questions/27440441
复制相似问题