Использование numba с time.clock () и timeit - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь проверить numba и numpy на очень простом примере и проверить эффективность. Однако

  1. Используя time.clock и timeit, я получаю очень разные результаты для numba.

  2. В случае time.clock это показывает, что использование numba с numpy замедляет работу функции.

  3. Имеет ли смысл использовать vectorize () для NbNpFunc?

Вот мой код. Спасибо за помощь.

import numpy as np
from numba import jit
import time
import timeit
#import math
#import matplotlib.pyplot as plt
#import matplotlib.animation as animation

N = 10000

def PyFunc(N):
    r = list(range(0,N)) 
    for i in range(0,len(r)):
            r[i] += r[i]*r[i]
    return(r)

def NpFunc(N):
    r = np.arange(0,N)
    r += r*r
    return(r)

@jit
def NbFunc(N):
    r = list(range(0,N))
    for i in range(0,len(r)):
        r[i] += r[i]*r[i]
    return(r)

@jit
def NbNpFunc(N):
    r = np.arange(0,N) 
    r += r*r
    return(r)

print("\nUsing time.clock()")
start_time = time.clock()
res1 = PyFunc(N)
print("PyFunc --- %s seconds ---"  %(time.clock() - start_time))    
start_time = time.clock()
res2 = NpFunc(N)
print("NumPyFunc --- %s seconds ---" % (time.clock() - start_time))    
start_time = time.clock()
res3 = NbFunc(N)
print("NumbaFunc --- %s seconds ---" % (time.clock() - start_time))    
start_time = time.clock()
res4 = NbNpFunc(N)
print("NumbaNpFunc --- %s seconds ---" % (time.clock() - start_time))    

print("\nUsing timeit")
t = timeit.Timer(lambda: PyFunc(N))
print ("PyFunc --- %s seconds ---" %t.timeit(number=1))
t = timeit.Timer(lambda: NpFunc(N))
print ("NumPyFunc --- %s seconds ---" %t.timeit(number=1))
t = timeit.Timer(lambda: NbFunc(N))
print ("NumbaFunc --- %s seconds ---" %t.timeit(number=1))
t = timeit.Timer(lambda: NbNpFunc(N))
print ("NumbaNpFunc --- %s seconds ---" %t.timeit(number=1))

1 Ответ

0 голосов
/ 26 апреля 2018

Ваш тест имеет несколько проблем

  • Вы должны вызывать каждую функцию один раз перед измерением производительности. В противном случае вы измеряете издержки компиляции
  • Таймеры не так точны, каждую функцию нужно запускать несколько раз
  • Даже в этом случае результаты могут отличаться, потому что у вас очень короткая функция, в этом случае могут возникнуть проблемы при вызове функции
  • Вы на самом деле не измеряете скорость расчета. Распределение памяти - самая дорогая часть вашего кода. Время для выделения памяти сильно зависит от сборщика мусора и других вещей, которые ядро ​​должно делать во время теста

Предложения по улучшению сравнительного анализа

  • Распределение памяти между руками

  • Создать более продолжительный код (увеличение N)

  • Выполните дополнительные вычисления в своем коде (sin, cos, sqrt), в случае сравнения простых умножений вы измеряете скорость ОЗУ и скорость кэш-памяти

  • Взгляните на nb.njit (fastmath = True)

  • Убедитесь, что установлена ​​новейшая версия Numba и установлена ​​ Intel SVML

...