Какая операция выполняется быстро для преобразования итератора в последовательность? - PullRequest
0 голосов
/ 27 мая 2020

Мне пришлось преобразовать итератор в последовательность с индексами (например, список, кортеж). Теперь, когда я попытался сделать это, я наткнулся на два варианта выполнения sh этого. Теперь возникает вопрос, какой из них наиболее рекомендуемый и быстрый?

Используйте конструктор tuple или list для преобразования.

percents = range(100+1)

tuple(percents)  # to a tuple.
list(percents)   # to a list.

Используйте распаковку в tuple или list понимание.

[*percents]   # to a list.
(*percents,)  # to a tuple.

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Интересно, что ответ не тот же для списков и кортежей (то есть работает на Python 3.8 на моей машине c - в зависимости от того, где выполняется ваш код и какая версия Python используется, ваш пробег может отличаться):

from timeit import timeit

percents = range(100+1)


def construct_tuple():
    tuple(percents)


def unpack_into_tuple():
    return *percents,


def construct_list():
    list(percents)


def unpack_into_list():
    return [*percents]


print(timeit(construct_tuple, number=1000000))
print(timeit(unpack_into_tuple, number=1000000))
print(timeit(construct_list, number=1000000))
print(timeit(unpack_into_list, number=1000000))

Результаты:

0.48456099999999996
0.5760516999999999
0.4818578
0.3919844000000001

Это остается таким же для больших итераций.

Теперь, почему распаковка быстрее для списков, но медленнее для кортежей, я не могу вам сказать. Возможно, это связано с тем, как понимание списка работает со своим параметром по сравнению с пониманием кортежа. Поразительно, что обе функции-конструкторы очень сопоставимы, в то время как понимание unpack_into_tuple() намного медленнее, чем понимание unpack_into_list()

. Ваш вопрос был "рекомендуемый и быстрый". Я бы сказал, что все они быстрые, поэтому рекомендуемый вариант действительно должен быть наиболее читаемым и поддерживаемым в вашем коде.

Если это ключевая часть вашего кода, которая выполняется миллионы раз, вы можете заботиться о скорости, но вы должны задаться вопросом, является ли Python лучшим выбором. Вероятно, вам лучше выбрать вариант, который наиболее понятен для других и для себя в будущем.

0 голосов
/ 27 мая 2020

я пробую, а они так близки

import timeit
percents = range(100+1)
timeit.timeit('tuple(percents)', number=10000, setup="from __main__ import percents")
timeit.timeit('list(percents)', number=10000, setup="from __main__ import percents")
timeit.timeit('(*percents,)', number=10000, setup="from __main__ import percents")
timeit.timeit('[*percents]', number=10000, setup="from __main__ import percents")

вы можете попробовать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...