Время задержки 10 с для time.sleep в ipython после импорта matplotlib 3.xx - PullRequest
1 голос
/ 19 марта 2019

Я понимаю, что time.sleep () вызывает таймер ОС и может немного отличаться (как указывает ответ ), но я вижу очень большое время задержки в Ipython.Кажется, это происходит только после того, как я импортировал matplotlib.pyplot.Затем сразу после ожидания около 30 секунд начинает отставать.Чтобы привести рабочий пример, попробуйте ввести iPython:

>>import matplotlib.pyplot as plt
# after 30 seconds
>>%time time.sleep(1)                                                        
CPU times: user 5.27 ms, sys: 3.58 ms, total: 8.85 ms
Wall time: 11 s

Использование более продолжительного времени в спящем режиме, по-видимому, имеет аддитивный эффект:

>>%time time.sleep(3)                                                        
CPU times: user 4.75 ms, sys: 3.7 ms, total: 8.45 ms
Wall time: 13 s

Время от времени настенное время подходит, нотолько около 1/10 времени.Я также попытался поместить сна в функцию следующим образом:

>>def test(): 
     start = time.time() 
     for i in range(4): 
         time.sleep(1) 
         print(f'{time.time() - start}')

>>test()                                                                
11.000279188156128
22.000601053237915
33.000962018966675
44.001291036605835

Это также иногда показывает меньшие временные шаги, но это обычный вывод.Я также поместил ту же функцию в отдельный файл и использовал% run script.py в iPython, с тем же результатом.Таким образом, это происходит каждый раз, когда вызывается time.sleep.

Единственное, что, по-видимому, работает: (а) не импортировать matplotlib.pyplot

или (б) определить функцию на основе простогоall-python timer:

>>def dosleep(t): 
     start = time.time() 
     while time.time() - start < t: 
         continue

>>%time dosleep(2)                                                      
CPU times: user 1.99 s, sys: 8.4 ms, total: 2 s
Wall time: 2 s

Последний пример кажется хорошим решением, но у меня есть приличный объем кода, который уже использует time.sleep (), и я хотел бы по-прежнему использовать Jupyter сядро Ipython.Есть ли способ определить, что его удерживает, или есть какие-нибудь советы, как уменьшить время задержки?Мне просто интересно, что это может вызвать.

Я нахожусь на Mac OS X 10.14.3, работающей на Python 3.6.8 (Anaconda).Моя версия Ipython - 7.3.0.Это работает так же для iPython 7.4.0.Версия matplotlib - 3.0.3.Проблема не возникает до тех пор, пока не будет взаимодействовать интерактивная система с графическим интерфейсом (это происходит сразу при импорте для matplotlib 3.x и при создании фигуры (plt.figure ()) с помощью matplotlib 2.x).Это происходит, когда в доке появляется значок «Python 3.6».

1 Ответ

0 голосов
/ 25 марта 2019

Я понял, что это время задержки. Поведение задержки происходит только при использовании бэкэндов matplotlib Qt5Agg и Qt4Agg.Это происходит независимо от того, использую ли я iPython или обычную консоль Python.Это не происходит при запуске файла путем ввода «python filename.py» в Терминал, хотя он задерживает файлы, которые запускаются через консоли iPython или python.Когда графический интерфейс запускается, поведение time.sleep срабатывает примерно через 30 секунд.

Мне удалось решить эту проблему, переключив бэкэнд на TkAgg, который работает аналогично и, похоже, хорошо работает в интерактивном режиме.Режим.Я только что сделал файл с именем "matplotlibrc" в моей базовой папке пользователя (~) и добавил строку

 backend      : TkAgg

, чтобы сделать бэкэнд по умолчанию TkAgg.Это не полностью отвечает, почему это происходит, но это решает проблему.

...