Pourquoi Python et Ruby si lent, tout en Lisp implémentations rapides?

Je trouve que les choses simples comme les appels de fonction et de boucles, et même des boucles tout en incrémentant un compteur de prendre loin plus de temps en Python et Ruby que le Poulet Régime, de la Raquette, ou SBCL.

Pourquoi est-ce donc? J'entends souvent les gens dire que la lenteur est un prix à payer pour les langages dynamiques, mais Lisps sont très dynamiques et ne sont pas ridiculement lent (ils sont généralement moins de 5 fois plus lent que le C; Ruby et Python peut aller dans les deux chiffres). En outre, Lisp style utilise la récursivité, et pas toujours de la queue de la récursivité, beaucoup, la pile est une liste liée de continuations dans le tas, etc, qui semblent être des choses qui devraient faire Lisp plus lent que l'impératif de style Python et Ruby.

De raquette et de SBCL sont JITted, mais le Poulet Schéma est soit compilé statiquement, ou utilise une non-optimisation de l'interprète, qui doit être mal adaptée à la dynamique des langues et lent. Pourtant, même à l'aide de la naïveté csi interprète pour le Poulet Régime (qui n'a même pas de faire du bytecode à la compilation!), Je reçois des vitesses bien au-delà de Python et Ruby.

Pourquoi, justement, Python et Ruby si ridiculement lent par rapport à la même dynamique Lisps? Est-ce parce qu'ils sont orienté objet et un besoin énorme vtables et type de hiérarchies?

Exemple: fonction factorielle. Python:

def factorial(n):
    if n == 0:
        return 1
    else:
    return n*factorial(n-1)

for x in xrange(10000000):
    i = factorial(10)

Raquette:

#lang racket

(define (factorial n)
  (cond
   [(zero? n) 1]
   [else (* n (factorial (sub1 n)))]))

(define q 0)

(for ([i 10000000])
  (set! q (factorial 10)))

Calendrier résultats:

ithisa@miyasa /scratch> time racket factorial.rkt
racket factorial.rkt  1.00s user 0.03s system 99% cpu 1.032 total
ithisa@miyasa /scratch> time python factorial.py
python factorial.py  13.66s user 0.01s system 100% cpu 13.653 total
  • SBCL ne pas utiliser un JIT. Il est strictement AOT.
  • SBCL a un REPL interprète...moi la common lisp n00b toujours été utilisée comme un interprète...
  • SBCL utilise un compilateur. Toujours et partout. Dans le REPL aussi. SBCL ne pas utiliser les services d'un interprète, par défaut. Chaque expression entrée dans le REPL sera compilé avant son exécution.
  • Oui, donc le REPL est techniquement un compilateur JIT...
  • pas de. Le REPL appelle juste la fonction EVAL, qui appelle le code natif compilateur. Le code est entièrement compilé à partir du code source en code natif AVANT l'exécution. C'est juste un différentiel, compilateur, qui permet de compiler des expressions individuelles. Il n'y a pas de code octet de compilation, pas de byte code en code natif compilation JIT, pas d'analyse de l'exécution, pas de cache de code, ... C'est un différentiels code natif compilateur.
  • Parce que les gens ont passé 55 ans, fait Lisp rapide, mais seulement 20,5 années de prise de Ruby rapide. Et parce que les gens ont dépensé des millions de dollars de prise de Lisp rapide.
  • Lisps ne sont pas de cette dynamique, en comparaison avec le canard de type de langages à objets.
  • En quoi est-Lisp "non dynamique"?
  • Lisp ne dépendent pas de la dynamique de la méthode d'expédition. Il a quelques fonctions polymorphes (notoirement, numérique de la tour), mais la majorité d'appel cibles sont decidable dans le temps de compilation, contrairement à des langages comme Python, où chaque appel a décidé dans l'exécution.
  • L'indice de référence ne fait pas justice à une main-d'python de l'utilisateur de la sortie. Ils utilisent pypy, numba, ou cython si le code n'était pas assez rapide. J'ai eu 18 secondes pour que le code donc regardé cython dans mon jupyter ordinateur portable. Une version naïve accéléré jusqu'à environ 4 fois à 5 secondes. Une version plus sophistiquée de l'application réduit à 0,33 secondes, plus rapide que le lisp et souvent proche de C. nbviewer.jupyter.org/github/john9631/Jupyter-Notebooks/blob/...

InformationsquelleAutor ithisa | 2013-11-09