random - Julia,生成四个数组,1:3 之间的 Int8 整数,我需要一个包吗?
问题描述
Ubuntu 上的 Julia 1.5.3。我试图简单地生成一个包含 1:3 范围的四个 Int8 整数的数组。尝试了一堆不同的语法,但只是得到错误。我无法同时控制类型(Int8)和数字或返回(4)。谢谢。Ĵ
rand(1:3, 4) # works
rand(Int8, 4) # works
rand(Int8, 1:3, 4) #error
rand(Int8, 4, 1:3) #error
rand(Int8(1:3), 3) #error
解决方案
最优雅和最有效的是:
rand(UnitRange{Int8}(1,3), 4)
编辑
Benoit Pasquier 指出,Int8(1):Int8(3)
他确实是对的。
这会产生更高效的汇编代码,因为编译器可以避免类型检查(当然只有当1
和3
是具体值时)。
以下是如何找出答案:
julia> @code_native (:)(Int8(1),Int8(3))
.text
; ┌ @ range.jl:5 within `Colon'
pushq %rbp
movq %rsp, %rbp
movl %ecx, %eax
; │┌ @ range.jl:287 within `UnitRange'
; ││┌ @ range.jl:292 within `unitrange_last'
; │││┌ @ int.jl:86 within `-'
leal -1(%rax), %r8d
; │││└
; │││┌ @ operators.jl:352 within `>='
; ││││┌ @ int.jl:442 within `<='
cmpb %dl, %al
; │││└└
movzbl %dl, %ecx
movzbl %r8b, %edx
cmovlel %ecx, %edx
; │└└
popq %rbp
retq
nopl (%rax,%rax)
; └
相比:
julia> @code_native UnitRange{Int8}(1,3)
.text
; ┌ @ range.jl:287 within `UnitRange'
pushq %rbp
movq %rsp, %rbp
subq $32, %rsp
movq %rcx, %rax
; │┌ @ number.jl:7 within `convert'
; ││┌ @ boot.jl:749 within `Int8'
; │││┌ @ boot.jl:639 within `toInt8'
; ││││┌ @ boot.jl:624 within `checked_trunc_sint'
movsbq %al, %rcx
cmpq %rax, %rcx
jne L49
; │└└└└
; │ @ boot.jl within `UnitRange'
movq %rdx, %r8
; │ @ range.jl:287 within `UnitRange'
; │┌ @ range.jl:292 within `unitrange_last'
; ││┌ @ int.jl:86 within `-'
leaq -1(%rax), %rdx
; ││└
; ││┌ @ operators.jl:352 within `>='
; │││┌ @ int.jl:442 within `<='
cmpq %r8, %rax
; ││└└
cmovleq %r8, %rdx
; │└
; │┌ @ number.jl:7 within `convert'
; ││┌ @ boot.jl:749 within `Int8'
; │││┌ @ boot.jl:639 within `toInt8'
; ││││┌ @ boot.jl:624 within `checked_trunc_sint'
movsbq %dl, %rcx
cmpq %rdx, %rcx
jne L72
; │└└└└
addq $32, %rsp
popq %rbp
retq
; │┌ @ number.jl:7 within `convert'
; ││┌ @ boot.jl:749 within `Int8'
; │││┌ @ boot.jl:639 within `toInt8'
; ││││┌ @ boot.jl:624 within `checked_trunc_sint'
L49:
movabsq $throw_inexacterror, %r8
movl $243577088, %ecx # imm = 0xE84B100
movq %rax, %rdx
callq *%r8
ud2
L72:
movabsq $throw_inexacterror, %rax
movl $243577088, %ecx # imm = 0xE84B100
callq *%rax
ud2
nopl (%rax,%rax)
; └└└└└
推荐阅读
- python - 在保留数据类型的同时导出熊猫数据框的格式是什么?不是 CSV;石榴石?镶木地板?
- python - 从 python 图中找到相应 x 的 y 值(matplotlib)
- database - 如何解决水晶报表中的数据库问题?
- c - 程序不写入另一个文件
- angular - 如何获取像 Compodoc 这样的 Angular 路由信息?(在编译时)
- python - 如何解决dash应用程序中的延迟加载和生产环境?
- javascript - React:如何在 ReactJS 中删除重复的路由名称
- javascript - 有没有办法从 Plotly.js 中的 plot.data 等 Dygraphs 中获取数据?
- sql - 如何对必须属于值('ve02','ve14;,'ve22')的组特殊列进行SQL查询
- angular - 如何从 Ionic Dynamic Select Options 中获取 ID 值和 NAME 值