Q : Как мне получить лучше результаты?
1 st : Узнайте, как избежать бесполезной работы - вы можете прямо исключить ПОЛОВИНУ FLOP-ов , не говоря уже о половине всей ОЗУ -Указаны входы / выходы, каждый из которых стоит +100~350 [ns]
за обратную запись
Из-за распределенного характера MUL и ADD ( a.C + b.C ) == ( a + b ).C
, лучше сначала np.sum( A )
и только после этого MUL
сумма по константе (с плавающей точкой).
#utput = np.sum(np.multiply(testarray, multconst)) # AWFULLY INEFFICIENT
output = np.sum( testarray)*multconst #######################
2 и : Узнайте, как лучше выровнять данные по порядок обработки (повторное использование строки кэша дает вам ~100x
быстрее повторное использование предварительно извлеченных данных. Не выравнивая векторизованный код по этим уже предварительно извлеченным побочным эффектам данных, просто позвольте вашему коду заплатить много время задержки доступа к ОЗУ, вместо умного повторного использования уже оплаченных блоков данных. Разработка рабочих блоков, выровненных по этому принципу, означает еще несколько SLOC, b но награды стоят того - кто получает ~100x
более быстрые ЦП + ОЗУ бесплатно и прямо сейчас или о ~100x
ускорении бесплатно, только если не писать плохо или наивно разработанные итераторы циклов?
3 rd : Узнайте, как эффективно использовать векторизованные (ориентированные на блоки) операции внутри numpy
или numba
кодовых блоков и избегать нажатия клавиши numba, чтобы тратить время на автоматический анализ вызова -подпись (вы платите дополнительное время за этот автоанализ для каждого вызова, в то время как вы разработали код и точно знали, какие типы данных будут там go, так зачем каждый раз платить за дополнительное время для автоматического анализа блок нумба называется ???)
4 th : Узнайте, где расширенный Закон Амдала , имея все соответствующие дополнения о затратах и обработке, заложенных в игру, поддерживает ваш wi sh, чтобы получить ускорения, чтобы никогда не платить больше, чем вы получите (по крайней мере, оправдать дополнительные расходы ...) - оплачивая дополнительные расходы за не получить y вознаграждение возможно, но не оказывает положительного влияния на производительность вашего кода (скорее наоборот)
5 th : Узнайте, когда и как встроенные строки создаются вручную ) может сохранить ваш код, если шаги 1-4 хорошо изучены и регулярно выполняются с надлежащим мастерством (использование популярных COTS-фреймворков - это хорошо, однако они могут дать результаты после нескольких дней работы, в то время как специально разработанное вручную интеллектуальное решение ассемблерный код смог получить те же результаты примерно за 12 минут (!), а не за несколько дней без каких-либо трюков с GPU / CPU и т. д. c - да, это быстрее - просто не делая ни одного шага больше, чем требовалось для числовая обработка больших матричных данных)