Я пытался ускорить некоторые вложенные циклы for с несколькими внутренними циклами в Python 3.11:
for item1 in iterable1:
for item2 in interable2:
if condition == true:
expression1
for item3 in interable3:
if condition2 == true:
expression2
Обратите внимание, что 2-й и 3-й циклы for находятся на одном уровне и не являются вложенными, в отличие от Этот Вопрос.
Я узнал, что понимание списков и функция map()
обычно работают намного быстрее, чем циклы for
Вот, и я пытаюсь преобразовать свои вложенные циклы в map()
функцию(и).
Может кто-нибудь объяснить, как создавать такие map()
функции и/или списки?
Я думал, что проведу небольшое исследование - наверняка в Интернете найдется ответ на такую проблему, но остался с пустыми руками. некоторые используемые ресурсы включают:
@LordElrond, окей, я сделаю это прямо сейчас!
«Я узнал, что понимание списка и функция map() обычно работают намного быстрее, чем циклы for Здесь» - Хм... этот связанный ответ, кажется, говорит прямо противоположное.
@F-22Разрушитель. И можете ли вы удалить код комментария.
@nocomment, имел в виду следующие несколько ответов, извини
удален код комментария
Мой второй вопрос...
@mightycodeNewton не я
Показывая минимальный воспроизводимый пример, убедитесь, что он работает, поскольку set('A', 'B')
не является допустимым Python. Кроме того, если вы заявляете о необходимости ускорить процесс, покажите контрольные значения: вы повторяете тривиальное количество элементов, зачем вам это оптимизировать? Какую на самом деле проблему вы пытаетесь решить? (например, что делает ваш реальный код, который вы протестировали и профилировали, а также определили конструкции циклов как горячие точки).
@F-22Разрушитель. окей, но ответ, который я опубликовал, это то, что вы хотите?
@mightycodeNewton вроде...
позвольте мне исправить мой вопрос
это мой второй звук
Их, просто забудь про второй блок кода
Обычно вы используете либо карту, либо понимание списка. Здесь вы можете составить сложное sum
выражение понимания. Он будет повторять то же самое, что и ваш основной цикл for, и заполнять логический двухкортеж. Затем сумма будет использовать комбинацию list/zip/unpack для получения удовлетворенных и неудовлетворенных. Код будет очень трудно читать, и я готов поспорить, что вы не добьетесь заметной производительности. Ваш код меня устраивает.
@Mike'Pomax'Kamermans dmoj.ca/problem/ccc22s2
последняя партия имеет более 300 000 входов
Не говорите мне, расскажите всем, отредактировав свой пост. Если вы выполняете онлайн-упражнения, расскажите об этом в своем посте. Пожалуйста (пере)прочитайте правила публикации и отредактируйте свое сообщение соответствующим образом. Если люди задают вам вопросы, это потому, что в вашем сообщении не указаны детали, которые вам нужно добавить (переписав его так, чтобы это был полный вопрос. Не используйте разделы «изменить: ....», правильно обновите текст сообщения: это будет оставаться здесь еще долгие годы, и будущие посетители должны иметь возможность понять, является ли ваш вопрос из прошлого их «текущим» вопросом).
Мне кажется, вы путаете несколько понятий:
Во-первых, понимание списков и циклы for — это одно и то же. Понимание списка — это просто более компактный способ написания цикла for. Вы можете переписать любое понимание списка как цикл for без существенного изменения производительности.
Например, если вы начнете со следующего цикла for:
iterable1 = ["a", "b", "c", "a", "e", "f", "a"]
result = []
for item in iterable1:
if item == "a":
result.append(item + "FOO")
else:
result.append(item)
print(result)
# ['aFOO', 'b', 'c', 'aFOO', 'e', 'f', 'aFOO']
Вы можете выразить это как понимание списка следующим образом:
iterable1 = ["a", "b", "c", "a", "e", "f", "a"]
result = [item + "FOO" if item == "a" else item for item in iterable1]
print(result)
# ['aFOO', 'b', 'c', 'aFOO', 'e', 'f', 'aFOO']
Два приведенных выше примера совершенно взаимозаменяемы — ни один из них не превосходит другой — это просто разные способы сказать одно и то же.
Если вы хотите использовать карту(), вы можете сделать это следующим образом:
iterable1 = ["a", "b", "c", "a", "e", "f", "a"]
conditional1 = lambda item: item == "a"
expression1 = lambda item: item + "FOO" if conditional1(item) else item
result = list(map(expression1, iterable1))
print(result)
# ['aFOO', 'b', 'c', 'aFOO', 'e', 'f', 'aFOO']
Использование map() существенно отличается от использования цикла, но использование понимания списка ничем не отличается от использования цикла.
Можете ли вы заменить утверждения
input
жестко закодированными данными? сложно понять ваш вопрос без минимального воспроизводимого примера.