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...) ;-)
# Scala
Posté par hsyl20 (site web personnel) . En réponse au journal Javascript plus rapide que python ! (une suite possible). Évalué à 4.
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...) ;-)