Это команда PDL :: Tipsp, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.
ПРОГРАММА:
ИМЯ
PDL :: Tips - Небольшие лакомые кусочки полезных тайн. Программные лакомые кусочки и тому подобное.
СИНТАКСИС
использовать PDL;
# Что бы здесь ни случилось.
ОПИСАНИЕ
На этой странице представлены полезные идиомы, полезные советы и подсказки по использованию Perl Data Language.
v2.0.
Помощь
Используйте «справку-помощь» в перлдл or pdl2 или используйте программу "pdldoc" из командной строки
для доступа к документации PerlDL. HTML-версии страниц также должны быть
настоящее время в HtmlDocs / PDL каталог распространения PDL. Чтобы найти этот каталог,
попробуйте следующее
pdl> foreach (map {"$ _ / PDL / HtmlDocs"} @ INC) {p "$ _ \ n" if -d $ _}
Индексирование идиомы
Следующий код нормализует набор векторов в $ a. Это работает независимо от
размерность $ a.
$ a / = $ a-> сумовер->фиктивный(0);
Что is на самом деле происходит?
Если вы хотите увидеть, что на самом деле делает код, попробуйте команду
PDL :: Core ::set_debugging(1);
где-то. Это извергает огромное количество отладочной информации для PDL в STDOUT. Планы на
будущее включает возможность перенаправления вывода, а также возможность
выбирать сообщения с большей точностью.
Многие сообщения поступают из «Basic / Core / pdlapi.c», и вы можете посмотреть источник, чтобы увидеть
что происходит.
Если у вас есть дополнительное время для работы над этими механизмами, сообщите об этом в рассылку pdl-porters.
.
Память экономия
Если вы рекурсивно запускаете что-то, что выбирает определенные индексы большого piddle,
" У аборигенов
в то время как(1) {
$ inds = где ($ a> 0);
$ a = $ a-> index ($ inds);
$ b = $ b-> index ($ inds);
func ($ b, $ a);
}
Если вы не пишете в $ b, это сэкономит много памяти, чтобы изменить это на
$ b = $ b-> index ($ inds) -> sever;
Новый метод "sever" заставляет забыть отношение обратной записи. Это похоже на
copy, за исключением того, что он изменяет исходный piddle и возвращает его).
Конечно, лучший способ сделать это -
$ inds = xval ($ a-> long);
в то время как(1) {
$ inds0 = где ($ a> 0);
$ inds1 = $ inds-> index ($ inds) -> sever;
$ a = $ a0-> index ($ inds1);
$ b = $ b-> index ($ inds1) -> sever;
func ($ b, $ a);
}
что не сохраняет все временные экземпляры $ a в памяти. См. "Mandel.pl" в
Поддиректория Demos дистрибутива PerlDL для примера.
PP скорость
Если вы действительно хотите написать быстрый PP-код, первое, что вам нужно сделать, это убедиться, что
что вашему компилятору C разрешено выполнять необходимые оптимизации.
Это означает, что вы должны разрешить как можно больше переменных входить в
регистры:
loop (a)% {
$ a () + = $ COMP (foo_member) * $ b ()
%}
расширяется до
for (i = 0; i <10000; i ++) {
a [я] + = __privtrans-> foo_member * b [i];
}
это самое худшее, что вы можете сделать, так как вашему компилятору C не разрешено предполагать, что "a"
не сбивает "foo_member", что полностью подавляет векторизацию. Вместо этого сделайте
float foo = $ COMP (foo_member);
loop (a)% {
$ a () + = foo * $ b ();
%}
Это ограничение вызвано не PP, а семантикой ANSI C. Конечно, мы могли скопировать
структура в локальные переменные и обратно, но это может вызвать очень странные вещи
иногда.
Есть много других вопросов по организации петель.
В настоящее время мы планируем сделать так, чтобы PP мог выполнять задачи фиксированной ширины, а также физические
piddles (где цикл по первым измерениям будет дешевле, так как их меньше
отдельные приращения, которые могут иметь значение на машинах с небольшим количеством
регистры).
Используйте PDL :: Tipsp онлайн с помощью сервисов onworks.net