Optimization Julia vs Python编译器/解释器优化

Optimization Julia vs Python编译器/解释器优化,optimization,julia,Optimization,Julia,我最近问了以下关于Python的问题: 假设我在x中有一个字符串,Python解释器是否足够聪明,可以 知道:string.replace(x,x)应该转换为NOP 答案似乎是否定的(尽管Python解释器可以通过窥视孔优化程序实现) 我不知道Julia中的等价表达式是什么,但Julia是否能够优化这些相对明显的类型 语句?依赖于编译器 问题是Julia能否向LLVM提供足够的信息,以便编译器能够优化内容 从您的示例可以看出,是的,您可以使用代码_native进行验证。例如,答案是预乘的,对x

我最近问了以下关于Python的问题:

假设我在x中有一个字符串,Python解释器是否足够聪明,可以 知道:
string.replace(x,x)
应该转换为
NOP

答案似乎是否定的(尽管Python解释器可以通过窥视孔优化程序实现)

我不知道Julia中的等价表达式是什么,但Julia是否能够优化这些相对明显的类型 语句?

依赖于编译器 问题是Julia能否向LLVM提供足够的信息,以便编译器能够优化内容

从您的示例可以看出,是的,您可以使用代码_native进行验证。例如,答案是预乘的,对x的不必要赋值被优化掉,函数总是返回一个常数

julia> f()=(x=7*24*60*60)
f (generic function with 1 method)

julia> code_native(f,())
    .section    __TEXT,__text,regular,pure_instructions
Filename: none
Source line: 1
    push RBP
    mov  RBP, RSP
    mov  EAX, 604800
Source line: 1
    pop RBP
    ret
从类型优化 它有时可以走得更远一些,因为可以从类型信息中获得更多的知识。相反,如果可能,应避免使用任何类型和global

例子 在第一种情况下,需要进行比较,因为y可能大于256,但在第二种情况下,因为它只有1个字节,所以它的值不能大于256,并且函数将被优化为始终返回1

案例一
julia>g(y::Int16)=(y code\u native(g,(Int16,))
.section\uuuu TEXT、\uuuu TEXT、常规、纯指令
文件名:无
来源行:1
推动RBP
mov RBP,RSP
cmp DI,256
来源行:1
塞特尔
movzx-EAX,AL
流行限制性商业惯例
ret
案例二
julia>g(y::Int8)=(y code_native(g,(Int8,))
.section\uuuu TEXT、\uuuu TEXT、常规、纯指令
文件名:无
来源行:1
推动RBP
mov RBP,RSP
mov-EAX,1
来源行:1
流行限制性商业惯例
ret
我认为答案是“有时”,因为它会传播常量并消除死代码。如果没有更具体的情况,很难回答,因为编译器在某些情况下很难推断(尽管可能比Python更容易)
julia> g(y::Int16)=(y<256?1:0)
g (generic function with 1 method)

julia> code_native(g,(Int16,))
    .section    __TEXT,__text,regular,pure_instructions
Filename: none
Source line: 1
    push RBP
    mov  RBP, RSP
    cmp  DI, 256
Source line: 1 
    setl  AL
    movzx EAX, AL
    pop   RBP
    ret
julia> g(y::Int8)=(y<256?1:0)
g (generic function with 2 methods)

julia> code_native(g,(Int8,))
    .section    __TEXT,__text,regular,pure_instructions
Filename: none
    Source line: 1
    push RBP
    mov  RBP, RSP
    mov  EAX, 1
Source line: 1
    pop  RBP
    ret