Nano Hash - криптовалюты, майнинг, программирование

Как распечатать ход понимания списка в python?

В моем методе я должен вернуть список в списке. Я хотел бы иметь понимание списка из-за производительности, поскольку для создания списка требуется около 5 минут.

[[token.text for token in document] for document in doc_collection]

Есть ли возможность распечатать прогресс, в каком документе сейчас находится процесс создания? Что-то такое:

[[token.text for token in document] 
  and print(progress) for progress, document in enumerate(doc_collection)]

Спасибо за вашу помощь!


  • Используйте цикл вместо понимания! 08.06.2018
  • @Клаус Д. Наверняка это сработает, но нет ли возможности добавить это в понимание? Спасибо, в любом случае! 08.06.2018
  • @Клаус Д. цикл for намного медленнее, чем list comprehension при создании списков 08.06.2018
  • @Chris_Rands Хорошая находка. Но я думаю, что этот вопрос лучше (короче и яснее, и без использования pandas), поэтому, возможно, было бы лучше закрыть старый вопрос как дубликат этого. Нам просто нужно Не делайте этого; используйте цикл for вместо ответа, тогда все готово. 08.06.2018
  • @ Аран-Фей слишком поздно ... Но я могу снова открыть и сделать это. Готово 08.06.2018
  • @ Aran-Fey Но я думаю, что этот вопрос лучше, хорошо, так почему у него только один голос (который не твой?) 08.06.2018
  • @Aran-Fey Я понимаю вашу точку зрения, но я ответил на другой вопрос как идеями print() or, так и побочных функций, а также немного большим объяснением, чем дано в этих ответах, но я предполагаю, что вздох 08.06.2018
  • @Jean-FrançoisFabre лучше не значит хорошо :p 08.06.2018
  • @Chris_Rands, вы недавно получили за это несколько голосов? :) 08.06.2018
  • @Chris_Rands Я думаю, что ответы на старый вопрос лучше; Мне просто не нравится многословие (и pandas использование) вопроса. Этот здесь легче понять для более широкой аудитории. Учитывая обстоятельства, я думаю, никто не обвинит вас в повторной публикации вашего ответа здесь :) 08.06.2018
  • @ Aran-Fey Я думаю, альтернативой было бы улучшить другой вопрос, разделив его на основные части. 08.06.2018

Ответы:


1

tqdm

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

pip install tqdm
from tqdm import tqdm

def process(token):
    return token['text']

l1 = [{'text': k} for k in range(5000)]
l2 = [process(token) for token in tqdm(l1)]
100%|███████████████████████████████████| 5000/5000 [00:00<00:00, 2326807.94it/s]

Нет требований

1/ Используйте побочную функцию

def report(index):
    if index % 1000 == 0:
        print(index)

def process(token, index, report=None):
    if report:
        report(index) 
    return token['text']

l1 = [{'text': k} for k in range(5000)]

l2 = [process(token, i, report) for i, token in enumerate(l1)]

2/ Используйте операторы and и or

def process(token):
    return token['text']

l1 = [{'text': k} for k in range(5000)]
l2 = [(i % 1000 == 0 and print(i)) or process(token) for i, token in enumerate(l1)]

3/ Используйте оба

def process(token):
    return token['text']

def report(i):
    i % 1000 == 0 and print(i)

l1 = [{'text': k} for k in range(5000)]
l2 = [report(i) or process(token) for i, token in enumerate(l1)]

Все 3 метода печатают:

0
1000
2000
3000
4000

Как работает 2

  • i % 1000 == 0 and print(i): and проверяет только второй оператор, если первый True, поэтому печатает только когда i % 1000 == 0
  • or process(token): or always checks both statements, but returns the first one which evals to True.
    • If i % 1000 != 0 then the first statement is False and process(token) is added to the list.
    • В противном случае первый оператор будет None (поскольку print возвращает None), и аналогичным образом оператор or добавляет process(token) в список.

Как работает 3

Аналогично 2, поскольку report(i) ничего не делает return, оно вычисляется до None, а or добавляет process(token) в список.

08.06.2018
  • вместо использования global i я бы выбрал enumerate и передал index function 08.06.2018
  • @Ev.Kounis, а также исключить отчетную часть с помощью обратного вызова (код отредактирован, чтобы исправить обе точки). 08.06.2018
  • Это и медленнее, и менее читабельно, чем цикл for. В моих (по общему признанию, очень ограниченных) тестах решение Алекса занимает 10 секунд, цикл for — 13, а этот — 17. 08.06.2018
  • @Aran-Fey Однако функциональность отличается; их нельзя сравнивать напрямую. 08.06.2018
  • @Ev.Kunis А? Что изменилось? Результат тот же, насколько я могу судить... 08.06.2018
  • Вы можете включать и выключать отчеты, и для print есть оператор if. Ответ Алекса просто print все. Не знаю, как выглядит ваш цикл for. 08.06.2018
  • Это стандартный метод. Но вы действительно должны использовать if index % 1000 == 0 and index > 0: в тесте - это намного чище. :) 15.03.2019
  • @ted, почему ты передаешь tok report? Функция ничего не делает с этим аргументом, поэтому его можно опустить. 19.08.2019
  • Это правда, это скорее демонстрация того, как это можно использовать. 21.08.2019

  • 2
    doc_collection = [[1, 2],
                      [3, 4],
                      [5, 6]]
    
    result = [print(progress) or
              [str(token) for token in document]
              for progress, document in enumerate(doc_collection)]
    
    print(result)  # [['1', '2'], ['3', '4'], ['5', '6']]
    

    Я не считаю этот код хорошим или читаемым, но идея забавная.

    Это работает, потому что print всегда возвращает None, поэтому print(progress) or x всегда будет x (по определению or).

    08.06.2018
  • Это НЕ должно быть принятым ответом - насколько я понимаю, такой код не пройдет проверку кода. Решение Теда — правильный способ решения проблемы. 08.06.2018

  • 3
    def show_progress(it, milestones=1):
        for i, x in enumerate(it):
            yield x
            processed = i + 1
            if processed % milestones == 0:
                print('Processed %s elements' % processed)
    

    Просто примените эту функцию ко всему, что вы повторяете. Неважно, используете ли вы понимание цикла или списка, его легко использовать где угодно практически без изменений кода. Например:

    doc_collection = [[1, 2],
                      [3, 4],
                      [5, 6]]
    
    result = [[str(token) for token in document]
              for document in show_progress(doc_collection)]
    
    print(result)  # [['1', '2'], ['3', '4'], ['5', '6']]
    

    Если вы хотите показать прогресс только для каждых 100 документов, напишите:

    show_progress(doc_collection, 100) 
    
    08.06.2018

    4

    Мне нужно сделать ответ @ted (imo) более читабельным и добавить некоторые пояснения.

    Приведенное в порядок решение:

    # Function to print the index, if the index is evenly divisable by 1000:
    def report(index):
        if index % 1000 == 0:
            print(index)
    
    # The function the user wants to apply on the list elements
    def process(x, index, report):
         report(index) # Call of the reporting function
         return 'something ' + x # ! Just an example, replace with your desired application
    
    # !Just an example, replace with your list to iterate over
    mylist = ['number ' + str(k) for k in range(5000)]
    
    # Running a list comprehension
    [process(x, index, report) for index, x in enumerate(mylist)]
    

    Объяснение: из enumerate(mylist): с помощью функции enumerate можно иметь индексы в дополнение к элементам итерируемого объекта (см. этот вопрос и ответы на него). Например

    [(index, x) for index, x in enumerate(["a", "b", "c"])] #returns
    [(0, 'a'), (1, 'b'), (2, 'c')]
    

    Примечание. index и x не являются зарезервированными именами, это просто имена, которые я считаю удобными — [(foo, bar) for foo, bar in enumerate(["a", "b", "c"])] дает тот же результат.

    19.08.2019

    5

    Вот моя реализация.

    pip install progressbar2

    from progressbar import progressbar
    new_list = [your_function(list_item) for list_item in progressbar(old_list)]`
    

    Вы увидите индикатор выполнения при выполнении блока кода выше.

    05.08.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..