Между делает кортеж и сделать итератор, это почти мыть, но итерация победа носа ...:
$ 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 элементов, кортеж замедляется, ИТЭР не делает:
$ 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))
в общем случае, кажется, лучше.
Очень приятно! Мне нравится, что это терпит неудачу, если количество элементов не равно 1. –
@Laurence: Это прекрасное наблюдение. Поймать ошибки рано, правда? – u0b34a0f6ae
Или, если вы хотите притвориться, что у Python есть правильный оператор для работы (ваши коллеги будут вас ненавидеть): 'element, = myset' – rdb