• # Scala

    Posté par (site web personnel) . En réponse au journal Javascript plus rapide que python ! (une suite possible). Évalué à 4.

    J'ai traduit littéralement les 2 versions Python en Scala:

    Version 1 :

    #!/usr/bin/env scala
    !#

    class Toto {
    for (a <- Range(2,100000)) {
    var sa = 1
    for (d <- Range(2,a-2))
    if (a%d == 0)
    sa += d
    var (b,sb) = (sa, 1)
    for (d <- Range(2,b-2))
    if (b%d == 0)
    sb += d
    if (sb == a && a < b)
    println(a+","+b)
    }
    }

    new Toto


    Version 2 :

    #!/usr/bin/env scala
    !#

    class Toto {
    //Pour ajouter la fonction "sort" à (x,y) comme dans le code Python
    implicit def tupl(t:Tuple2[Int,Int]) = new {
    def sort = if (t._1 > t._2) t.swap else t
    }

    val NB_ENTRIES = 1000000
    val d = Array.fill(NB_ENTRIES)(1)

    for (i <- Range(2, NB_ENTRIES / 2))
    for (j <- Range(2 * i, NB_ENTRIES, i))
    d(j) += i

    println ( for (i <- Range(0, d.length) if d(i) < NB_ENTRIES && d(d(i)) == i && i <= d(i)) yield (i, d(i)).sort )
    }

    new Toto


    Là ce sont les versions "script". Pour avoir une version pré-compilée en bytecode, enlever l'entête et remplacer "new Toto" par:

    object Pouet {
    def main(args:Array[String]) {
    new Toto
    }
    }

    Compiler avec scalac Toto.scala
    Exécuter avec scala Pouet


    Résultats avec 1M éléments :
    Python V1 : j'ai arrêté après 14 minutes
    Python V2 : entre 3.7s et 4s
    Scala V1 : environ 50 minutes
    Scala V2 : entre 1.3s et 1.6s
    Scala V2 compilé : entre 0.60s et 0.66s

    J'espère que ça va donner envie aux programmeurs Python qui voudraient passer à un langage qui a au moins la même expressivité que Python et qui est plus rapide et plus fiable (typage statique...) ;-)