Python: Почему IDLE такой медленный? - PullRequest
22 голосов
/ 06 февраля 2010

IDLE - мой любимый редактор Python. Он предлагает очень приятную и интуитивно понятную оболочку Python, которая чрезвычайно полезна для модульного тестирования и отладки, и аккуратный отладчик.

Однако код, выполняемый под IDLE, работает безумно медленно. Безумно я имею в виду 3 порядка медленно:

Баш

time echo "for i in range(10000): print 'x'," | python

Занимает 0,052 с,

IDLE

import datetime
start=datetime.datetime.now()
for i in range(10000): print 'x',
end=datetime.datetime.now()
print end-start

принимает:

>>> 0:01:44.853951

Что примерно в 2000 раз медленнее.

Есть мысли или идеи, как это улучшить? Я думаю, это как-то связано с отладчиком в фоновом режиме, но я не совсем уверен.

Адам

Ответы [ 2 ]

30 голосов
/ 06 февраля 2010

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

Я только что попробовал это на моей системе Q6600 (разогнанной по 3GHz), и мои цифры еще хуже. Но легко увидеть, что они снижаются, если добавить больше выходного текста.

Я пытался запустить его с

1000 итераций => 7,8 с 2000 итераций => 28,5 сек 3000 итераций => 70 сек

В прошлом я занимался низкоуровневыми ТЗ, и я знаю, что виджет TkText хранит текст в структуре BTree. Добавление текста к символу время - один из худших способов сделать это, но похоже, что именно это делает IDLE. Обычный способ - перехватить больше данных и добавить больший фрагмент текста.

Удивительно, если вы напишите print 'x \ n', результат будет намного быстрее. 3000 итераций за 7 секунд и ваши 10000 за 19 секунд.

Так что проблема определенно в добавлении одиночных символов в существующие строки. Программист IDLE не знал, как работает TkText.

Так что советуем добавлять новые строки в ваш текст или выводить более крупные куски, а не только один символ «x».

9 голосов
/ 06 февраля 2010

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

...