众所周知,迭代器显示出比普通列表理解更好的性能:
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] 删除。
我来说两句