Nano Hash - криптовалюты, майнинг, программирование

numba - guvectorize очень медленный по сравнению с jit

Я экспериментировал с @jit и @guvectorize Numba и обнаружил, что @guvectorize значительно медленнее, чем @jit. Например, у меня есть следующий код, который вычисляет скользящую среднюю:

import numpy as np
from numba import *

@guvectorize(['void(float64[:], float64[:], float64[:])'], '(n),()->(n)')
def sma(x, m, y):
    n = x.shape[0]
    mi = int(m)
    y[:] *= np.nan
    for i in range(mi-1, n):
        for j in range(i-mi+1, i+1):
            y[i] = x[j] if j == i-m+1 else y[i]+x[j]
        y[i] /= double(mi)

@jit(float64[:](float64[:], float64))
def sma1(x, m):
    n = x.shape[0]
    mi = int(m)
    y = np.empty(x.shape[0]) * np.nan
    for i in range(mi-1, n):
        for j in range(i-mi+1, i+1):
            y[i] = x[j] if j == i-m+1 else y[i]+x[j]
        y[i] /= double(mi)
    return y

Вот код тестирования:

import movavg_nb as mv1
import numpy as np
x = np.random.random(100)

import time as t

t0 = t.clock()
for i in range(10000):
    y = mv1.sma(x, 5)
print(t.clock()-t0)

t0 = t.clock()
for i in range(10000):
    y = mv1.sma1(x, 5)
print(t.clock()-t0)

Я запускал это дважды, потому что Numba обычно нужно присваивать типы в первый раз. Вот результаты тестирования кода во второй раз:

17.459737999999998  # corresponding to @guvectorize
0.036977999999997735  # corresponding to @jit

Порядок величины > 450x

Вопрос: я могу понять цель @vectorize (где входы одинаковы), но какова будет цель @guvectorize, когда @jit быстрее? (или что-то в моем коде замедляет его?)

28.06.2015

  • Попробуйте запустить свой код с помощью профилировщика: это может указать вам правильное направление. huyng.com/posts/python-performance-analysis может помочь.. . 28.06.2015
  • Цель @guvectorize заключается в том, что вы можете передавать вещи с большим количеством измерений, чем указано, и он разумно применяет их к дополнительным измерениям (например, попробуйте вызвать mv1.sma с двумя массивами и посмотрите на форму вывода). Хотя насчет скорости не знаю. 28.06.2015
  • Я думаю, что компилятор задыхается на строке y[:] *= np.nan и должен вернуться в объектный режим. В этом случае скомпилированный код не намного быстрее обычных циклов Python. 12.07.2015

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..