Оптимизация скорости обращения к данным через foreach

Язык Python, который используется в API Blender, очень лоялен и нетребователен к типизации данных. Однако при работе с большими объемами данных универсализация преобразования типов может негативно сказываться на скорости работы кода. Например, простейшая инструкция foreach_get(), получающая данные с набора элементов и помещающая их в массив, может быть значительно ускорена просто правильным подбором типа данных, помещаемых в массив.

Пользователь Mysteryem в чате Blender провел исследование на примере получения данных о положении location каждой частицы в системе частиц из 10 000 элементов.

В эксперименте создавались разные виды массивов, в которые потом при помощи инструкции foreach_get() помещались данные о положении частиц.

Массивы создавались следующих типов:

  • обычный массив чисел с плавающей точкой float
  • обычный массив чисел с плавающей точкой двойной точности double
  • массив numpy чисел с плавающей точкой float
  • массив numpy чисел с плавающей точкой двойной точности double
  • массив ctypes чисел с плавающей точкой float
  • массив ctypes чисел с плавающей точкой двойной точности double

Код Mysteryem:

Результат выполнения кода следующий:

Результаты выполнения могут отличаться в зависимости от используемого компьютера и операционной системы.

По результатам выполнения кода можно сделать следующие выводы:

Максимальную скорость продемонстрировал цикл foreach_get() при использовании numpy массива с типом данных float, который соответствует типу данных положения location частиц.

Любое несоответствие исходному типу данных требует дополнительных преобразований, что может существенно сказываться на скорости работы цикла. Так, тот же самый массив numpy показывает значительное уменьшение скорости при использовании типа double.

5 1 голос
Article Rating
Подписаться
Уведомить о
guest

0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии