IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

danielhagnoul

Julia. Les premiers pas du débutant, sixième partie.

Noter ce billet
par , 02/11/2020 à 16h07 (243 Affichages)
  • Le 2020-11-2, j'utilise Julia_1.5.2 sur VS_Code_1.50.1. Ordinateur : W10 Pro, i9-10900F.
  • Mes billets précédents sur Julia sont supposés connus et assimilés.
  • Préalable, vous n'êtes pas un novice en programmation.


Nous allons aborder le concept de type et étudier les sujets suivants :

1. Conception de types abstraits et de types concrets



2. Comprendre les types de paramètres



3. Conversion entre types de données


Conseil

Plus vous utilisez votre système de typage, plus il fonctionne pour vous.

Si vous n'utilisez que des types primitifs, n'attendez pas beaucoup plus qu'un comportement primitif pour votre système de types.

Utilisez des types riches pour décrire votre domaine et vous constaterez que votre système de type applique réellement votre domaine !

Licence Creative Commons Attribution 2.0 Belgique

Envoyer le billet « Julia. Les premiers pas du débutant, sixième partie. » dans le blog Viadeo Envoyer le billet « Julia. Les premiers pas du débutant, sixième partie. » dans le blog Twitter Envoyer le billet « Julia. Les premiers pas du débutant, sixième partie. » dans le blog Google Envoyer le billet « Julia. Les premiers pas du débutant, sixième partie. » dans le blog Facebook Envoyer le billet « Julia. Les premiers pas du débutant, sixième partie. » dans le blog Digg Envoyer le billet « Julia. Les premiers pas du débutant, sixième partie. » dans le blog Delicious Envoyer le billet « Julia. Les premiers pas du débutant, sixième partie. » dans le blog MySpace Envoyer le billet « Julia. Les premiers pas du débutant, sixième partie. » dans le blog Yahoo

Commentaires

  1. Avatar de dourouc05
    • |
    • permalink
    Plus vous utilisez votre système de typage, plus il fonctionne pour vous.
    … et, moins on utilise le système de typage, mieux Julia fonctionne ! C'est comme ça qu'on peut résoudre des équations différentielles sur des nombres complexes ou des erreurs de mesure, par exemple. Si DifferentialEquations.jl (entre autres) forçaient à utiliser des Float64 partout, ça ne pourrait pas marcher aussi bien.

  2. Avatar de danielhagnoul
    • |
    • permalink
    Je ne suis pas encore assez compétent en Julia pour discuter de ce sujet avec toi, mais j'ai trouvé une référence de 2016.

    Performance and Concrete Types in Julia posted by PAUL STEY on JULY 20, 2016

    Extrait de la fin de cet article :

    Les résultats ci-dessus sont vraiment frappants. En termes de vitesse, nous voyons que notre version de type concret de la fonction est environ 4x plus rapide que notre version de type non concret (d'ailleurs, c'est environ 14x plus rapide que Python pour des vecteurs de longueur 10 millions). Nous notons également que la vitesse évolue linéairement (ou un peu mieux) avec la taille d'entrée.

    Mais ce que je trouve fascinant, c'est que nos allocations et notre utilisation de la mémoire sont en fait constantes par rapport à la taille d'entrée! Dans notre version non concrète, notre appel de fonction alloue 300 Mo de mémoire sur le vecteur de longueur 10 millions; et la version de type béton n'utilise que 768 octets .

    Cela m'a bouleversé quand je suis tombé dessus. Cela ressemble fondamentalement à de la magie. La leçon ici semble claire: lorsque les performances sont critiques, faites tout ce que vous pouvez pour utiliser des types concrets.
  3. Avatar de dourouc05
    • |
    • permalink
    L'exemple que tu reprends, outre son âge (depuis 2016, Julia a énormément évolué, mais globalement les résultats n'ont pas changé dans ce cas), parle d'un cas un peu différent : donner des types quand on est sûr de ce qu'on va y stocker. L'idéal serait plutôt d'écrire le code avec des paramètres comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function count_numbers(v::Vector{T}) where T
        n = length(v)
        d = Dict{T, Int}()
        for i = 1:n 
            d[v[i]] = get(d, v[i], 0) + 1
        end 
        return d 
    end
    count_numbers2 est une écriture très foireuse : Julia ne râlera pas lors de l'appel de la fonction avec un vecteur de nombres à virgule flottante, mais ça plantera lors de l'ajout dans le dictionnaire… Mon code évitera ce problème, tout en ayant une performance similaire (d'après mes tests préliminaires avec la version 1.5.0, ça prend le même temps et un peu moins de mémoire que count_numbers2). Surtout, on peut utiliser cette fonction avec d'autres types de nombres ou même autre chose (un vecteur de distributions de probabilités, par exemple), ce qui n'est pas du tout le cas avec count_numbers2.