ith*_*isa 23 ruby lisp python performance scheme
我发现像函数调用和循环这样的简单事情,甚至只是递增计数器的循环在Python和Ruby中花费的时间远远多于Chicken Scheme,Racket或SBCL.
为什么会这样?我经常听到有人说慢速是你为动态语言付出的代价,但是Lisps非常动态并且速度不是很慢(它们通常比C慢不到5倍; Ruby和Python可以达到两位数).此外,Lisp样式使用递归,并不总是尾递归,很多,堆栈是堆中的连续的链接列表等,这似乎应该使Lisp比命令式样式的Python和Ruby慢.
Racket和SBCL是JITted,但Chicken Scheme要么是静态编译的,要么使用非优化的解释器,这两种解释器都应该非常适合动态语言并且速度慢.即使使用了csi
Chicken Scheme 的天真解释器(甚至不进行字节码编译!),我的速度远远超出了Python和Ruby.
与类似的动态Lisps相比,为什么Python和Ruby的速度如此之慢?是因为它们是面向对象的,需要巨大的vtable和类型heirarchies?
示例:阶乘函数.蟒蛇:
def factorial(n):
if n == 0:
return 1
else:
return n*factorial(n-1)
for x in xrange(10000000):
i = factorial(10)
Run Code Online (Sandbox Code Playgroud)
球拍:
#lang racket
(define (factorial n)
(cond
[(zero? n) 1]
[else (* n (factorial (sub1 n)))]))
(define q 0)
(for ([i 10000000])
(set! q (factorial 10)))
Run Code Online (Sandbox Code Playgroud)
时间结果:
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
Run Code Online (Sandbox Code Playgroud)
Rai*_*wig 17
编译的Lisp系统通常比Ruby或Python快得多.
例如,参见Ruby和SBCL的比较:
http://benchmarksgame.alioth.debian.org/u32/benchmark.php?test=all&lang=yarv&lang2=sbcl&data=u32
或Python和SBCL:
http://benchmarksgame.alioth.debian.org/u32/benchmark.php?test=all&lang=python3&lang2=sbcl&data=u32
但请记住以下内容:
一些操作可能看起来相似,但可能不同.for
迭代遍历整数变量的循环是否与循环遍历for
范围的循环完全相同?