Яким способом (и) можна порівняти функцію Julia?


11

Фон

Я самоучив себе машинним навчанням і останнім часом почав заглиблюватися в екосистему Джулія машинного навчання.


Виходячи з пітонного фону та маючи деякий досвід Tensorflow та OpenCV / skimage, я хочу порівняти бібліотеки Julia ML (Flux / JuliaImages) проти своїх колег, щоб побачити, наскільки швидко чи повільно він реально виконує резюме (будь-які) завдання та вирішити, чи Я повинен перейти до використання Юлії.

Я знаю, як отримати час, необхідний для виконання функції в python, використовуючи такий timeitмодуль:

#Loading an Image using OpenCV

s = """\
img = cv2.imread('sample_image.png', 1)
"""
setup = """\
import timeit
"""
print(str(round((timeit.timeit(stmt = s, setup = setup, number = 1))*1000, 2)) + " ms")
#printing the time taken in ms rounded to 2 digits

Як можна порівнювати час виконання функції, що виконує те саме завдання в Джулії, використовуючи відповідну бібліотеку (у цьому випадку JuliaImages).

Чи надає Юлія якусь функцію / макрос до часу / орієнтиру?

Відповіді:


10

using BenchmarkToolsє рекомендованим способом орієнтації функцій Джулії. Якщо ви не призначаєте щось, що займає досить багато часу, використовуйте один @benchmarkабо менш багатослівні @btimeмакроси, експортовані з нього. Оскільки механізм, що стоїть за цими макросами, багато разів оцінює цільову функцію, @timeє корисним для тестування речей, які працюють повільно (наприклад, де задіяний доступ до диска або дуже трудомісткі розрахунки).

Важливо використовувати @btimeабо @benchmarkправильно, це дозволяє уникнути оманливих результатів. Зазвичай ви орієнтуєте функцію, яка бере один або кілька аргументів. При порівняльному оцінці всі аргументи повинні бути зовнішніми змінними: (без макросу еталону)

x = 1
f(x)
# do not use f(1)

Функція буде оцінюватися багато разів. Щоб запобігти повторній оцінці аргументів функції кожного разу, коли функція оцінюється, ми повинні позначити кожен аргумент, префіксуючи а $до імені кожної змінної, яка використовується як аргумент. Макроси бенчмаркінгу використовують це для вказівки, що змінна повинна бути оцінена (вирішена) один раз, на початку процесу бенчмаркінгу, а потім результат слід використовувати безпосередньо безпосередньо, як це:

julia> using BenchmarkTools
julia> a = 1/2;
julia> b = 1/4;
julia> c = 1/8;
julia> a, b, c
(0.5, 0.25, 0.125)

julia> function sum_cosines(x, y, z)
         return cos(x) + cos(y) + cos(z)
       end;

julia> @btime sum_cosines($a, $b, $c);  # the `;` suppresses printing the returned value
  11.899 ns (0 allocations: 0 bytes)    # calling the function takes ~12 ns (nanoseconds)
                                        # the function does not allocate any memory
# if we omit the '$', what we see is misleading
julia> @btime sum_cosines(a, b, c);    # the function appears more than twice slower 
 28.441 ns (1 allocation: 16 bytes)    # the function appears to be allocating memory
# @benchmark can be used the same way that @btime is used
julia> @benchmark sum_cosines($a,$b,$c) # do not use a ';' here
BenchmarkTools.Trial:
  memory estimate:  0 bytes
  allocs estimate:  0
  --------------
  minimum time:     12.111 ns (0.00% GC)
  median time:      12.213 ns (0.00% GC)
  mean time:        12.500 ns (0.00% GC)
  maximum time:     39.741 ns (0.00% GC)
  --------------
  samples:          1500
  evals/sample:     999

Хоча є параметри, ніж можна відрегулювати, значення за замовчуванням зазвичай працюють добре. Для отримання додаткової інформації про BenchmarkTools для досвідчених користувачів див . Посібник .


7

Джулія надає два макроси для виконання часу / часу порівняльного коду. Це:

  • @time
  • @benchmark : зовнішній, встановитиPkg.add("BenchmarkTools")

Використовувати BenbenmarkTools '@benchmark дуже просто і було б корисно для вас у порівнянні швидкості двох мов. Приклад використання @bencharkпроти лавки python, яку ви надали.

using Images, FileIO, BenchmarkTools

@benchmark img = load("sample_image.png")

Вихід:

BenchmarkTools.Trial: 
  memory estimate:  3.39 MiB
  allocs estimate:  322
  --------------
  minimum time:     76.631 ms (0.00% GC)
  median time:      105.579 ms (0.00% GC)
  mean time:        110.319 ms (0.41% GC)
  maximum time:     209.470 ms (0.00% GC)
  --------------
  samples:          46
  evals/sample:     1

Тепер для порівняння середнього часу, ви повинні поставити samples(46) як число у вашому коді python timeit і розділити його на те саме число, щоб отримати середній час виконання.

print(str(round((timeit.timeit(stmt = s, setup = setup, number = 46)/46)*1000, 2)) + " ms")

Ви можете прослідкувати за цим процесом для порівняльної оцінки будь-якої функції в Julia та Python. Я сподіваюся, що сумніви були ліквідовані


Примітка . Зі статистичної точки зору @benchmark набагато краще, ніж @time.


2
Зауважте, що шум у часі є переважно позитивним, що означає, що мінімальний час часто (не завжди) є більш інформативним. @btimeі @belapsedповернути лише мінімальний час.
Фредрік Багге
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.