我可以用什么方法对Julia函数进行基准测试? 背景

我可以用什么方法对Julia函数进行基准测试? 背景,julia,Julia,我自学了机器学习,最近开始钻研Julia机器学习生态系统。 我来自python背景,有一些Tensorflow和/或经验,我想将Julia ML库(Flux/JuliaImages)与其对应的库进行基准测试,看看它执行CV(任何)任务的速度有多快或有多慢,并决定是否应该改用Julia 我知道如何使用如下模块获得在python中执行函数所需的时间: #使用OpenCV加载图像 s=”“”\ img=cv2.imread('sample\u image.png',1) """ setup=”“”\

我自学了机器学习,最近开始钻研Julia机器学习生态系统。
我来自python背景,有一些Tensorflow和/或经验,我想将Julia ML库(Flux/JuliaImages)与其对应的库进行基准测试,看看它执行CV(任何)任务的速度有多快或有多慢,并决定是否应该改用Julia

我知道如何使用如下模块获得在python中执行函数所需的时间:

#使用OpenCV加载图像
s=”“”\
img=cv2.imread('sample\u image.png',1)
"""
setup=”“”\
导入时间信息
"""
打印(str(圆形((timeit.timeit(stmt=s,setup=setup,number=1))*1000,2))+“ms”)
#打印所用时间(毫秒),四舍五入为2位
如何使用适当的库(在本例中,
JuliaImages
)比较在Julia中执行相同任务的函数的执行时间

Julia是否为时间/基准测试提供了任何函数/宏?

Julia提供了两个用于计时/基准测试代码运行时的函数/宏。这些是:

  • @时间
  • :外部,通过
    Pkg.add(“基准测试工具”)安装
使用BenchmarkTools'@benchmark非常简单,这将有助于您比较两种语言的速度。 对您提供的python工作台使用
@benchark
的示例

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(圆((timeit.timeit(stmt=s,setup=setup,number=46)/46)*1000,2))+“ms”)
您可以按照这个过程对Julia和Python中的任何函数进行基准测试。 我希望你的疑虑已经消除



注意

建议使用基准工具
对函数进行基准测试。除非您正在计时需要花费相当长时间的事情,否则请使用
@benchmark
或从中导出的不太详细的
@btime
宏。由于这些宏背后的机制会多次评估目标函数,
@time
对于测试运行缓慢的事物(例如,涉及磁盘访问或非常耗时的计算)非常有用

正确使用
@btime
@benchmark
非常重要,这样可以避免产生误导性的结果。通常,您是在对一个包含一个或多个参数的函数进行基准测试。进行基准测试时,所有参数都应该是外部变量:(不带基准宏)

该函数将被评估多次。为了防止函数参数在每次求值时被重新求值,我们必须通过在用作参数的每个变量的名称前加前缀
$
来标记每个参数。基准测试宏使用这一点来指示应在基准测试过程开始时对变量进行一次评估(解析),然后直接按原样重用结果:

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

虽然存在可以调整的参数,但默认值通常工作良好。有关经验丰富的URSER基准测试工具的更多信息,请参见。

注意,计时噪音大多为正值,这意味着最短时间通常(并非总是)更具信息性
@btime
@belapsed
仅返回最短时间。
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