Компромиссы и соображения по условной распаковке кортежей в Python: в первую очередь производительность, но также и стилPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Компромиссы и соображения по условной распаковке кортежей в Python: в первую очередь производительность, но также и стил

Сообщение Anonymous »


У меня есть часть логики в Python, которая включает распаковку кортежа на основе условий.

Код создает экземпляры двух переменных и присваивает этим переменным распакованные значения кортежа.

Этот кортеж определяется условно: если условное_выражение истинно, то функция выполняет возврат кортежа, в противном случае предоставляются и назначаются значения по умолчанию.

Насколько я понимаю, есть два простых способа реализовать это:

# Метод 1 # если условное_выражение: обработанные_данные, контекст = tuple_returner(raw_data) еще: обработанные_данные, контекст = raw_data[0], нет # Способ 2 # обработанные_данные, контекст = ( tuple_returner (сырые_данные) если условное_выражение иначе raw_data[0], Нет ) Я попробовал оба способа, и оба работают хорошо, как и ожидалось.

У меня двойной вопрос:
[*]
Может ли один из методов оказаться более производительным, чем другой (в стандартной реализации CPython)? Я не заметил каких-либо существенных различий при запуске тестов timeit (хотя метод 2 кажется немного медленнее - см. нижний фрагмент), но мне было интересно, происходит ли что-нибудь более глубокое под -капюшон, о котором я не знаю.
[*]
Является ли какой-либо метод более Pythonic и в целом предпочтительным для сообщества, чем другой? Я не увидел внутри PEP8 ничего конкретного, что могло бы помочь мне в этом вопросе. Оба варианта кажутся мне читабельными, но эта база кода прослужит долго, и над ней будут работать несколько участников, поэтому хотелось бы придерживаться лучших практик.

Кстати, фактический код является частью большого проекта Django, включающего некоторую сложную бизнес-логику внутри задачи Celery, и эта парадигма часто повторяется во всех задачах, где мы обрабатываем данные и поддерживаем контекст < em>(а иногда мы распаковываем гораздо больше, чем два значения). Поэтому, если есть стилистические соображения, специфичные для Django, то это было бы полезно знать!

Для тех, кто хочет увидеть мою оценку timeit, см. ниже:
импортировать время импортировать случайный защита tuple_returner (данные): вернуть данные * 2, данные * 3 Защитный метод1(): условное_выражение = случайный.выбор([Истина, Ложь]) raw_data = случайный.randint(1, 1000) если условное_выражение: обработанные_данные, контекст = tuple_returner(raw_data) еще: обработанные_данные, контекст = необработанные_данные, нет Защитный метод2(): условное_выражение = случайный.выбор([Истина, Ложь]) raw_data = случайный.randint(1, 1000) обработанные_данные, контекст = tuple_returner(raw_data), если условное_выражение else (raw_data, None) time1_a = timeit.timeit(метод1, число=10000000) time1_b = timeit.timeit(метод1, число=10000000) time1_c = timeit.timeit(метод1, число=10000000) time1_d = timeit.timeit(метод1, число=10000000) time1_e = timeit.timeit(метод1, число=10000000) время1_среднее = (время1_a + время1_b + время1_c + время1_d + время1_e) / 5 time1_median = sorted([time1_a, time1_b, time1_c, time1_d, time1_e])[2] time2_a = timeit.timeit(метод2, число=10000000) time2_b = timeit.timeit(метод2, число=10000000) time2_c = timeit.timeit(метод2, число=10000000) time2_d = timeit.timeit(метод2, число=10000000) time2_e = timeit.timeit(метод2, число=10000000) время2_среднее = (время2_a + время2_b + время2_c + время2_d + время2_e) / 5 time2_median = sorted([time2_a, time2_b, time2_c, time2_d, time2_e])[2] print("Метод 1: среднее = {0}, медиана = {1}".format(time1_mean, time1_median)) ## -> Выход: Метод 1: среднее = 10,77958505996503, медиана = 10,693453999934718 print("Метод 2: среднее = {0}, медиана = {1}".format(time2_mean, time2_median)) ## -> Выход: Метод 2: среднее = 11,350917899981141, медиана = 11,356302100000903
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»