­
­

Названия переменных в динамических ЯП

топ 100 блогов _winnie05.10.2010 1. Квадрат длины вместо длины 3d-вектора.
Известная многим фишка оптимизации при сравнении длин векторов, вкратце расскажу про неё.
Пусть у нас есть 3d-вектора. Многие помнят как вычислять его длину - sqrt(x2+y2+z2). Часто в коде надо сравнивать длины векторов (найти самого близкого противника и тп).

Код вида Point3d direction1, direction2; direction1.length() < direction2.legnth()) вычисляет два квадратных корня, можно смело заменять его на direction1.lengthSquared () < direction2.lengthSquared ()), где lengthSquared не извлекает корень из x2+y2+z2. Что может быть раз в 10 быстрей.

2. Сюрприз при скриптинге. 100 тактов FPU против хеш-таблиц. .
В нашем движке, экспортированные из C++ для python 3d-вектора имеют методы length и lengthSquared. И в документации постулируется, что лучше вызывать lengthSquared когда надо сравнить длины векторов, типа это быстрей и корень не извлекается. Проверил это, и получил сюрприз - lengthSquared оказался на 5% медленней чем length. Объяснение простое - все поля/методы объекта в python это строки в хеш-таблице. Строка "lengthSquared" длинней чем "length". И суета с длиной идентификатора в хеш-таблице оказалась важней чем наличие квадратного корня. Вывод - в динамическом ЯП неважно что звать, вычисление "сложного" синуса или тупое сложение. Если хотим выжать сколько-то (десятков) процентов скорости не переписывая на C - стоит класть методы объектов в локальные переменные, ls = Point3d.lengthSquared; ls(dir1) < ls(dir2);

3. Сюрприз при скриптинге - 2. Глобальные переменные против локальных. .
Доступ к глобальной переменной в питоне - достаточно долгая операция. Питону нужно проверить пачку вложеных неймспейсов, что бы найти глобальную переменную, причем по строковому имени.
Доступ к локальным переменным - гораздо быстрей, без поисков по хеш-таблицам ( строка превращается в индекс при генерации байт-кода ).
У нас много всяких Enum, часто код насыщен использованием enum-типа вроде
Moving.Direction.NORTH, Moving.Direction.SOUTH, Moving.Direction.EAST, Moving.Direction.WEST.
После присваивания Moving.Direction в локальную переменную
Dir = Moving.Direction; Dir.NORTH, Dir.SOUTH, Dir.EAST, Dir.WEST
опять же выигрывал десятки процентов по производительности.
Разрушением картины миры для моего коллеги так же стало, что код при переписывании со строк на enum ( напр. MoveObject("EAST") на MoveObject(Moving.Direction.EAST)) замедлился. У него после C++ в голове не укладывалось, что использование строк может быть быстрее, чем целочисленного enum. А причина была именно в том, что Moving.Direction.EAST - это аж три поиска строк по хеш-таблицам, причем первый - в глобальном namespace с сотнями глобальных имен.
По той же причине for i in range(1000*1000): j = i*i перенесённый из глобальной области в функцию тоже может сильно ускориться (переменные i,j из глобальных станут локальными).

Оставить комментарий

Архив записей в блогах:
Здравствуйте. Расскажите про powershift от голубого овала пожалуйста. Совсем ломучее гавно? А при пробеге 70 000 все мозги выклюет или можно взять и ездить еще тыщ 30? mondeoclub.ru покурил но как-то лучше не стало:) Спасибо. вместо баб: ...
Фото Кейт Бекинсейл, которой 43 года от роду и ее 21-летнего парня Мэтта Райфа сейчас рвут на части дабы и публику порвало. А что, в Голливуде все просто - хочешь попиариться, будучи актрисой за сорокет, так заводи молодого парня и загребай хайп. А молодые влюбленные только стараются ...
http://vimeo.com/24428802 "От первого лица #63" Михаил Веллер from Нейромир-ТВ on Vimeo . ...
Как сделать так, чтобы mail app проверял орфографию при написании письма?комп 10. 4. ...
Я долго думала насчет феминизма, и все никак не могла понять, отчего он меня так раздражает. Ведь нет ничего плохого в том, что женщины стали голосовать, водить машину или считаться мужчине равными. Однако в итоге вместо запланированного равенства началось повальное: «Мне не нужен ...