正如icza 在评论中指出的那样,实际上将其编译并作为Go代码运行,它运行得非常快:
package main
import (
"fmt"
"time"
)
func fib(n int) int {
if n < 2 {
return n
} else {
return fib(n-1) + fib(n-2)
}
}
func main() {
s := time.Now()
fmt.Println(fib(34))
d := time.Now().Sub(s)
fmt.Println("took", d)
}
$ go run fib.go
5702887
took 49.244697ms
(注意:以上是草率的:我们应该使用int64
,我只是懒惰)。
Python3 变体:
import time
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
s = time.time()
print(fib(34))
print(f"took {time.time() - s}s")
需要更长的时间:
$ python3 fib.py
5702887
took 2.1027958393096924s
正如peterSO 所指出的,递归算法进行了很多调用:
package main
import (
"fmt"
"time"
)
var calls int
func fib(n int) int {
calls += 1
if n < 2 {
return n
} else {
return fib(n-1) + fib(n-2)
}
}
func main() {
s := time.Now()
fmt.Println(fib(34))
d := time.Now().Sub(s)
fmt.Println("took", d, "to make", calls, "calls")
}
$ go run fib.go
5702887
took 53.328049ms to make 18454929 calls
(额外的几毫秒是由于计算调用)。所以 Go 在大约 50 毫秒内运行了 1845 万次调用,而 Python 在大约 2.1 秒内运行了同样的 1845 万次调用。Go 每次调用大约需要 2.7 ns,Python 每次调用大约需要 114 ms。