AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 77029618
Accepted
Essam
Essam
Asked: 2023-09-03 02:44:28 +0800 CST2023-09-03 02:44:28 +0800 CST 2023-09-03 02:44:28 +0800 CST

Quando devo usar anotações de tipo para variáveis, argumentos e tipos de retorno em Julia?

  • 772

Na seção de tipos dos documentos, é mencionado que

O operador :: pode ser usado para anexar anotações de tipo a expressões e variáveis ​​em programas. Existem duas razões principais para fazer isso:

  1. Como uma afirmação para ajudar a confirmar se o seu programa funciona da maneira esperada,
  2. Para fornecer informações extras de tipo ao compilador, o que pode melhorar o desempenho em alguns casos

No entanto, não consigo encontrar onde estão as menções em quais "casos" especificamente as anotações de tipo ajudam a melhorar o desempenho.

Surpreendentemente, mais tarde menciona na seção de dicas de desempenho

A anotação de tipo não melhorará (e poderá até prejudicar) o desempenho se o tipo for abstrato ou construído em tempo de execução.

Não discute exaustivamente os casos em que isso realmente prejudicaria o desempenho para que possam ser evitados.

Eu estava procurando uma resposta para a pergunta do título na documentação. Apesar de serem legais, agora estou ainda mais confuso. Existem regras simples a serem seguidas sobre quando ou não anotar tipos para os três casos do título?

types
  • 2 2 respostas
  • 24 Views

2 respostas

  • Voted
  1. Antonello
    2023-09-03T05:15:25+08:002023-09-03T05:15:25+08:00

    Como argumento de função você anota para asserção ou para implementar despacho múltiplo, mas não para performances.

    O mesmo em geral para anotação de variáveis, exceto um caso específico que são membros de struct, onde a anotação de todos os membros fará uma grande diferença.

    • 2
  2. Best Answer
    Bogumił Kamiński
    2023-09-03T05:51:17+08:002023-09-03T05:51:17+08:00

    Apenas um caso importante que não foi abordado por Antonello.

    Não consigo encontrar onde estão as menções em quais "casos" especificamente as anotações de tipo ajudam a melhorar o desempenho.

    O caso em que a anotação de tipo ajuda é quando o tipo não pode ser deduzido em tempo de compilação. Aqui está um exemplo:

    julia> v = collect(Any, rand(1:10, 10^7));
    
    julia> function f1(x::AbstractVector)
               s = 0
               for i in eachindex(x)
                   v = x[i]
                   a = v + v
                   b = 2 + v
                   c = v - 1
                   d = a + c
                   e = a - b + c - v
                   s += e
               end
               return s
           end
    f1 (generic function with 1 method)
    
    julia> function f2(x::AbstractVector)
               s = 0
               for i in eachindex(x)
                   v::Int = x[i]
                   a = v + v
                   b = 2 + v
                   c = v - 1
                   d = a + c
                   e = a - b + c - v
                   s += e
               end
               return s
           end
    f2 (generic function with 1 method)
    
    julia> @time f1(v)
      1.055734 seconds (10.00 M allocations: 152.800 MiB, 1.03% gc time, 0.76% compilation time)
    24995270
    
    julia> @time f1(v)
      1.178262 seconds (10.00 M allocations: 152.585 MiB, 0.45% gc time)
    24995270
    
    julia> @time f2(v)
      0.688447 seconds (3.46 k allocations: 226.578 KiB, 1.75% compilation time)
    24995270
    
    julia> @time f2(v)
      0.716612 seconds (1 allocation: 16 bytes)
    24995270
    
    julia> function sum1(x::AbstractVector)
               s = 0
               for i in eachindex(x)
                   v = x[i]
                   s += v
               end
               return s
           end
    sum1 (generic function with 1 method)
    
    julia> function sum2(x::AbstractVector)
               s = 0
               for i in eachindex(x)
                   v::Int = x[i]
                   s += v
               end
               return s
           end
    sum2 (generic function with 1 method)
    
    julia> @time sum1(v);
      0.260931 seconds (10.00 M allocations: 152.752 MiB, 17.27% gc time, 2.90% compilation time)
    
    julia> @time sum1(v);
      0.227542 seconds (10.00 M allocations: 152.586 MiB, 2.32% gc time)
    
    julia> @time sum2(v);
      0.738166 seconds (2.51 k allocations: 167.264 KiB, 1.08% compilation time)
    
    julia> @time sum2(v);
      0.761652 seconds (1 allocation: 16 bytes)
    

    O que você vê aqui é o fato de que quando escrevemos v::Int = x[i]o código dentro do loop é do tipo estável. Quando escrevemos, v = x[i]o código não é de tipo estável e causa alocações.

    Você pode então perguntar por que sum1(not type stable) é mais rápido que sum2(type stable). A razão é que quando escrevemos v::Int = x[i]não é apenas uma afirmação de tipo. Na verdade, é um requisito de conversão de tipo; por exemplo, se x[i]fosse Bool, seria convertido para Int. O fato de a conversão ser tentada também custa caro. O custo de conversão das funções f1e f2é muito menor que o overhead causado pelas operações em valores instáveis ​​do tipo. Mas nas funções sum1e sum2o oposto é verdadeiro.

    Em resumo - as coisas não são óbvias (e podem até mudar nas versões de Julia). É por isso que o Manual Julia não pode fornecer uma regra precisa.


    Além disso, o que é relevante saber é que:

    • quando você anota uma variável ou valor de retorno de uma conversão de função é tentada
    • quando você anota a conversão do parâmetro de função não é tentada (esta anotação é usada para envio)
    • 1

relate perguntas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve