Между созданием кортежа и созданием итератора это почти стирка, но итерация выигрывает носом ...:
$ python2.6 -mtimeit -s'x=set([1])' 'a=tuple(x)[0]'
1000000 loops, best of 3: 0.465 usec per loop
$ python2.6 -mtimeit -s'x=set([1])' 'a=tuple(x)[0]'
1000000 loops, best of 3: 0.465 usec per loop
$ python2.6 -mtimeit -s'x=set([1])' 'a=next(iter(x))'
1000000 loops, best of 3: 0.456 usec per loop
$ python2.6 -mtimeit -s'x=set([1])' 'a=next(iter(x))'
1000000 loops, best of 3: 0.456 usec per loop
Не уверен, почему во всех ответах используется более старый синтаксис iter(x).next()
, а не новый next(iter(x))
, который мне кажется предпочтительным (а также работает в Python 3.1).
Однако, распаковка выигрывает у обоих:
$ python2.6 -mtimeit -s'x=set([1])' 'a,=x'
10000000 loops, best of 3: 0.174 usec per loop
$ python2.6 -mtimeit -s'x=set([1])' 'a,=x'
10000000 loops, best of 3: 0.174 usec per loop
Это, конечно, для наборов из одного элемента (где последняя форма, как уже упоминалось, имеет преимущество быстрого отказа, если набор, о котором вы «знали», имел только один элемент, на самом деле имел несколько). Для наборов с произвольным числом элементов N> 1 кортеж замедляется, а iter не:
$ python2.6 -mtimeit -s'x=set(range(99))' 'a=next(iter(x))'
1000000 loops, best of 3: 0.417 usec per loop
$ python2.6 -mtimeit -s'x=set(range(99))' 'a=tuple(x)[0]'
100000 loops, best of 3: 3.12 usec per loop
Итак, распаковка для одноразового чехла и next(iter(x))
для общего дела кажутся наилучшими.