Научная статья на тему 'Профилирование и оптимизация кода приложения для построения поверхности функции двух переменных на языке Python'

Профилирование и оптимизация кода приложения для построения поверхности функции двух переменных на языке Python Текст научной статьи по специальности «Компьютерные и информационные науки»

CC BY
282
70
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
PYTHON / КОД ПРИЛОЖЕНИЯ / ПРОФИЛИРОВАНИЕ КОДА / ОПТИМИЗАЦИЯ КОДА

Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Перцев Павел Юрьевич, Зубарева Елена Васильевна

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

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Перцев Павел Юрьевич, Зубарева Елена Васильевна

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

Текст научной работы на тему «Профилирование и оптимизация кода приложения для построения поверхности функции двух переменных на языке Python»

Перцев П.Ю.1, Зубарева Е.В.2

*ФГБОУ ВПО «Елецкий государственный университет им. И.А. Бунина», магистрант 2МГУ имени М.В. Ломоносова, факультет вычислительной математики и кибернетики старший научный сотрудник, к.п.н., andropovamsu@gmail.com

Профилирование и оптимизация кода приложения для построения поверхности функции двух переменных на

языке Python

КЛЮЧЕВЫЕ СЛОВА:

Python, код приложения, профилирование кода, оптимизация кода. АННОТАЦИЯ:

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

Современные условия разработки и внедрения информационных технологий на предприятиях и в организациях требуют от специалистов по компьютерной технике и программированию готовности и способности к работе с компьютерной графикой, к созданию трехмерных моделей, к обработке визуальной информации, полученной из реального мира. Области интересов ученых и ИТ-специалистов по применению компьютерной графики очень широки: это и геометрическое моделирование, и научная визуализация, и компьютерная графика для мобильных устройств, и модели представления изображений, и сегментация и кластеризация и т. д.

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

Цель статьи - изучить возможности профилирования и оптимизации кода (ручного и автоматического) на примере приложения для построения графика поверхности аналитической функции двух переменных, разработанного на языке Python с использованием библиотеки трехмерной

графики OpenGL.

Разработанное приложение обладает следующими возможностями: выбор инструментов задания аналитической функции и области ее определения; изменение шага построения; построение поверхности в виде каркасной или закрашенной поверхности с расчетом теней; автоматическое масштабирование координатных осей и единичной сетки, задающей плоскость OXY; проверка корректности значений шага и области построения; вывод справки по работе с программой; произвольное вращение поверхности и ее масштабирование; отображение в ортогональной и перспективной проекции; выбор средств, производящих измерение скорости отображения поверхности; изменение размеров окна программы с автоматическим масштабированием зоны вывода.

Работа по разработке приложения включала в себя ряд этапов. На первом из них был разработан графический интерфейс приложения средствами wxPython (рис. 1).

-\п\х

Файл Инструменты ?

Скриншот 1 Цвета | Справка | Функция

Выход I О программе

| sin(x)+cos(y)

Диапазон

+ Минимум Максимум

X Н:

Y

s; H

Тнп графика 0 Каркас О' Поверхность

Построить

Сменить перспективу

Рис. 1. Графический интерфейс приложения

На следующем этапе были реализованы алгоритмы построения каркасной и закрашенной поверхностей ортографической (рис.2) и перспективной (рис.3) проекций с использованием встроенных библиотек и модулей wx, OpenGL.GL, OpenGL.GLU, math, time языка Python.

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

трех элементов (нормированный вектор) (рис.4).

Рис. 2. Ортографическая проекция для построения поверхности

Р ры ю

Файл Инструменты

Функция

Диапазон

Минимум Максимум

К -10 Н 10

-10

а

10

3

з

Тип графика О Сетка в Поверхность

Шаг

:

Построить

Сменить перспективу |

Рис. 3. Перспективная проекция для построения поверхности

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

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

инструментов для замера времени выполнения различных участков кода -профайлеров. Как отмечено в [1], для ручного замера производительности может быть использована функция clock() модуля time. Данный метод реализован в разработанном приложении. Кроме того в стандартной комплектации Python доступны и специализированные инструменты профилирования - это модули profile (или cProfile), timeit и hotspot [4].

Файл Инструменты ?

Функция

sin{x)+cos{y)

Диапазон

Минимум Максимум

X ^Tg

-10 1 10 g

Тип графика О Сетка <§) Поверхность

I Построить I [ Сменить перспективу |

р Plot 3D I Щ I @ ММ

Рис. 4. Пример ассоциации вектора нормали с вершинами

В простейшем случае необходимо импортировать модуль profile и вызвать profile.run(), передав в качестве параметра функцию, которую необходимо проверить на быстродействие: import profile

profile.run('main_function()')

Модуль timeit нужен для удобного замера времени работы одиночных выражений. Он удобен для организации различных экспериментов с замером производительности. Так, для замера времени 200 вызовов функции main_function() программный код выглядит следующим образом: from timeit import Timer

t1=Timer("main_function() ","from __main__ import main_function") print t1.timeit(200)

Также следует учитывать, что программа, реализующая некоторый алгоритм, не может быть оптимизирована до бесконечно малого времени вычисления: используемый алгоритм имеет определенную временную сложность и программу, основанную на слишком сложном алгоритме, существенно оптимизировать не удастся [3].

Для оценки времени работы алгоритмов построения поверхности в программу был импортирован модуль time стандартной библиотеки, предоставляющий различные функции для работы со временем. Импортированная функция clock() возвращает текущее процессорное время

в секундах в виде вещественного числа. Точность возвращаемого времени зависит от точности одноименной функции библиотеки языка C в реализациях для различных платформ. Функция clock() может быть использована, в том числе, и для замера производительности [2].

Для измерения скорости работы рассмотренных алгоритмов была написана функция timeDraw(): def timeDraw(self, event): repeat=100 start = clock() for i in range(repeat):

self.defFunction(event) print и"Тип графика: %s" % GraphType print и"Шаг: %2.2f" % step print и"Время выполнения, мс.: %f \n"

% ((clock() - start)/repeat*(10**3)) print и"Область построения:" print u"X: [%2.1f; %2.1f]" % (minX, maxX) print u"Y: [%2.1f; %2.1f]" % (minY, maxY) Для повышения точности расчетов функция построения поверхности defFunction() вызывалась значительное количество раз, указанное в переменной repeat. После выполнения цикла вычислялось отношение затраченного времени и количества повторов.

Зависимость времени работы алгоритма от шага при фиксированной области построения Xi[-10,0;10,0], Yi[-10,0;10,0] указана в таблице 1.

Диаграмма, иллюстрирующая данные зависимости, изображена на

рис.5.

Таблица 1. Зависимость времени работы алгоритма от шага построения

Шаг построения Время построения, мс.

Каркасная поверхность Закрашенная поверхность

0,4 84,56 166,02

0,5 58,75 112,98

0,6 42,48 78,40

0,7 32,50 60,40

0,8 31,34 53,90

0,9 29,70 47,18

1,0 25,99 38,81

1,1 23,47 33,88

1,2 19,51 24,88

1,3 18,95 23,00

1,4 17,70 21,38

1,5 16,55 20,17

1,6 15,39 18,80

1,7 14,92 18,45

1,8 14,73 17,76

1,9 14,74 16,53

2,0 14,41 16,54

Зависимость времени работы алгоритма от области построения при фиксированном шаге (5 единиц) указана в таблице №2. Диаграмма, иллюстрирующая данные зависимости изображена на рис. 6.

Таблица №2. Зависимость времени работы алгоритма от области построения

Время, мс. Размер области построения по X

1 2 3 4 5 6 7 8 9 10

Размер области построения по Y 1 2,14 2,41 2,72 3,02 3,36 3,64 3,95 4,26 4,63 4,81

2 2,38 3,01 3,58 4,13 4,76 5,38 5,91 6,47 7,17 7,73

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

3 2,68 3,60 4,45 5,22 6,21 7,00 7,89 8,73 10,47 10,53

4 2,98 4,10 5,33 6,48 7,48 8,66 9,86 10,9 12,14 13,39

5 3,37 4,64 6,12 7,56 8,96 10,36 11,91 13,30 14,70 16,06

6 3,55 5,32 6,93 8,58 10,41 11,90 13,78 15,37 17,11 18,71

7 3,85 5,85 7,85 9,80 11,81 13,79 15,71 17,65 19,46 21,62

8 4,11 6,37 8,73 11,03 13,29 15,51 17,79 19,92 22,32 24,48

9 4,45 6,97 9,48 12,00 14,64 17,15 19,41 22,06 24,26 26,87

10 4,73 7,58 10,34 13,13 15,85 18,62 21,60 24,21 27,03 29,79

Из полученных результатов следует, что зависимость времени

выполнения от шага построения - экспоненциальная, а от области построения - линейная, что объясняется аналогичными зависимостями между данными величинами и количеством полигонов.

Таким образом, специализированные инструменты profile (или cProfile), timeit и hotspot языка Python делают профилирование и оптимизацию кода программы простым и, даже, интересным занятием.

25-30 120-25 115-20 10-15 15-10 10-5

Рис. 6. Зависимость времени работы алгоритма от области построения при

фиксированном шаге

Литература

1. Лутц, М. Изучаем Python, 3-е издание [Текст] / М. Лутц. - СПб.: Символ-Плюс, 2009. - 848 с.

2. Россум, Г. Язык программирования Python [Текст] / Г. Россум, Ф.Л.Дж. Дрейк, Д.С. Откидач, М. Задка, М. Левис и др. - 2001. - 454 с.

3. Сузи, Р. А. Язык программирования Python - Курс лекций [Текст] / Р.А. Сузи. — М.: ИНТУИТ, БИНОМ. Лаборатория знаний, 2006. - 206с.

4. Черкес, А. Сказ о летающем змее. Агрессивная оптимизация программ на Python'e [ЭВ] / А. Черкес. - Хакер № 03 (123). - 2009. - URL: http://www.xakep.rU/magazine/xa/123/102/1.asp (дата обращения 10.12.12)

i Надоели баннеры? Вы всегда можете отключить рекламу.