Julia 编程基础》第 228 页:

当然了,程序的好坏肯定不能单凭是否节省内存空间来衡量。如果我们观测程序的执行时间(可以用 @timev 宏),会发现生成器表达式通常还不如包含了数组推导式的相应代码执行速度快。

我使用以下代码进行测试(代码中的“生成器表达式”和“数组推导式”来源于书中同一页):

function test(n)
  println("\n性能测试(n = $(n))")
  println("生成器表达式:")
  @timev reduce(*, (x for x=1:n))
  println("\n数组推导式:")
  @timev reduce(*, [x for x=1:n])
end

println("Julia Version $(VERSION)")
test(10)
test(10^8)

运行结果如下:

$ julia p228.jl 
Julia Version 1.5.0

性能测试(n = 10)
生成器表达式:
  0.000000 seconds
elapsed time (ns): 62

数组推导式:
  0.000014 seconds (1 allocation: 160 bytes)
elapsed time (ns): 13845
bytes allocated:   160
pool allocs:       1

性能测试(n = 100000000)
生成器表达式:
  0.000000 seconds
elapsed time (ns): 50

数组推导式:
  0.335083 seconds (2 allocations: 762.940 MiB, 1.03% gc time)
elapsed time (ns): 335083357
gc time (ns):      3449954
bytes allocated:   800000080
pool allocs:       1
malloc() calls:    1
GC pauses:         1

可见,在上述代码中,生成器表达式比包含数组推导式的相应代码执行速度快。


以下代码根据这本书的作者郝林老师给出数组推导式写成:

println("Julia Version $(VERSION)")
println("生成器表达式:")
@timev map(tuple, (1/(i+j) for i=1:2, j=1:2), [1 3; 2 4])
println("\n数组推导式:")
@timev map(tuple, [1/(i+j) for i=1:2, j=1:2], [1 3; 2 4])

运行结果:

$ julia p228a.jl
Julia Version 1.5.0
生成器表达式:
  0.157070 seconds (587.07 k allocations: 31.358 MiB)
elapsed time (ns): 157069903
bytes allocated:   32880759
pool allocs:       586924
non-pool GC allocs:150

数组推导式:
  0.112933 seconds (344.12 k allocations: 17.103 MiB, 5.04% gc time)
elapsed time (ns): 112932620
gc time (ns):      5686877
bytes allocated:   17934120
pool allocs:       344109
non-pool GC allocs:13
GC pauses:         1

可见,在上述代码中,生成器表达式比包含数组推导式的相应代码执行速度慢。