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

У меня есть две идентичные процедуры, которые выводят статистику прогресса в блокнот Jupyter. Я использую clear_output для обновления вывода для каждого обработанного элемента. Эти процедуры кажутся мне идентичными. Тем не менее, поведение обновления, наблюдаемое для каждой из процедур, существенно отличается.

Хотя один вывод одного фрагмента является плавным, другой очень глючный.

Сглаженный вывод

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

datal = list()
t0 = perf_counter()
ta = Timer(len(elements))
for element in elements:
    clear_output(wait=True)
    t1 = perf_counter()
    telapsed = t1 - t0
    print('Element:', element)
    print('Processing element', elements.index(element)+1, 'of', len(elements))
    print('Processed', round((elements.index(element)+1)/len(elements)*100), '%')
    print('Time elapsed', '{:d} h : {:d} m : {:d} s'.format(trunc(telapsed) // 3600, trunc(telapsed) % 3600 // 60, trunc(telapsed) % 60))
    print('Time left', ta.remains(elements.index(element)+1))

    datal.extend(get_data(element))

Пример вывода:


'''
First element
'''

Element: MyElementX
Processing element 1 of 12345
Processed 100 %
Time elapsed 0 h : 1 m : 15 s
Time left 30 minutes

'''
Second element
'''

Element: MyElementY
Processing element 2 of 12345
Processed 100 %
Time elapsed 0 h : 2 m : 30 s
Time left 30 minutes

Отрывистый вывод

Следующая процедура выдает причудливый вывод . При перемещении к element блок, в котором выводятся 5 строк , сворачивается, отображая только первую строку (Элемент: MyElementX). И затем Jupyter dr aws строка секунд, третья строка и т. Д. Рендеринг выходного блока для расширения с каждым новым обработанным элементом. В результате он производит мерцание. Вы видите, что строки выводятся одна за другой, поэтому блок записной книжки, следующий за выводом, всегда сворачивается, а затем расширяется путем вывода строк.

datal = list()
total = dataframe.shape[0]-1
t0 = perf_counter()
ta = Timer(dataframe.shape[0])

for element in dataframe['field']:
            clear_output(wait=True)
            t1 = perf_counter()
            telapsed = t1 - t0
            print('Element:', element)
            print('Processing element', len(datal), 'of', total)
            print('Processed', round((len(datal))/total*100), '%')
            print('Time elapsed', '{:d} h : {:d} m : {:d} s'.format(trunc(telapsed) // 3600, trunc(telapsed) % 3600 // 60, trunc(telapsed) % 60))
            print('Time left', ta.remains(len(datal)+1))

            datal.append(get_data(element))

Пример вывода

Здесь я предпринял попытку продемонстрировать, как строки обновляются по очереди:


'''
First element
'''

Element: MyElementX


Element: MyElementX
Processing element 1 of 12345

Element: MyElementX
Processing element 1 of 12345
Processed 100 %

Element: MyElementX
Processing element 1 of 12345
Processed 100 %
Time elapsed 0 h : 1 m : 15 s
Time left 30 minutes

'''
Second element
'''

Element: MyElementY

Почему обновляется первый пример сразу же без создания этого мерцания, а второй пример производит этот мерцание, чтобы числа в строках не обновлялись в строке? Выходной блок рывков сворачивается до 1 строки и расширяется до 5 строк. Как это исправить, чтобы не было мерцания во время обновления?

Спасибо.

...