Numba не увеличивает производительность, как ожидалось - PullRequest
0 голосов
/ 19 мая 2019

Я тщательно перевёл некоторую функцию в своем коде с не-нумбы на нумбу.Я сделал это, чтобы увеличить время, так как я программирую Quadtree для вычисления площади множества пересекающихся кругов.Тем не менее, я не получил увеличение эффективности.Наоборот, эффективность уменьшается , когда я раскомментирую jit decorator!Весь код занимает около 1 секунды без декоратора и около 3 секунд с декоратором.Я выполняю повторные вызовы двух функций Numba в другом цикле, который содержит объекты, которые я не смог преобразовать в формат Numba.

Весь фрагмент кода состоит из сотен строк, поэтому я приведу минимальный пример, иллюстрирующий один из них.из ключевых операций в моем алгоритме (сравнение элементов в массивах Numpy).Версия Python 2.7.15, а версия numba 0.41.0+0.gf118cda06.dirty.

import numpy  as     np
import numba
from datetime import datetime
from numba    import jit  

@jit(nopython=True)
def test():
    a = np.array([0.3, 0.5])
    b = np.array([0.4, 0.6])
    c = (a[0] < b[1])
    return c
start = datetime.now()
c     = test()
end   = datetime.now()
diff  = end - start 
print "c is", c, diff.microseconds, "microseconds"

Когда @jit(nopython=True) декоратор без комментариев (как в фрагменте кода), я получаю:

c is True 0 microseconds

Когда это комментируется , я получаю:

c is True 153000 microseconds

Почему это так неблагоприятно?

1 Ответ

4 голосов
/ 19 мая 2019

numba.jit называется jit, потому что это JIT .Как в, сборка точно в срок. Он ничего не компилирует до первого вызова функции. Вы тратите время на компиляцию.

Можно сделать функции компиляции Numba заранее, сообщивэто то, что подписи ожидают , но это мало что дает.

Кроме того, diff.microseconds - это просто компонент микросекунд, пропускающий секунды или дни.Вам нужен diff.total_seconds(), который дает значение с плавающей запятой, представляющее общую продолжительность временной дельты в секундах, или diff / timedelta(microseconds=1) для значения в микросекундах.

...