История изменений
Исправление monk, (текущая версия) :
На моём компьютере (Racket 6.11, Python 3.5.1+) твои примеры:
$ time racket mand.rkt 10000000 1
real 0m6,321s
user 0m6,108s
sys 0m0,224s
$ time python3 mand.py 10000000 1
real 0m4,887s
user 0m4,820s
sys 0m0,020s
Если проставить типы для Racket (иначе он комплексную арифметику делает в предположении, что там могут быть числа произвольной точности), тогда
$ time racket mand2.rkt 10000000 1
real 0m1,733s
user 0m1,636s
sys 0m0,100s
$ cat mand2.rkt
#lang racket/base
(require racket/unsafe/ops)
(struct complex (r i))
(define c (complex 0.04 0.01))
(define (complex+ a b)
(complex (unsafe-fl+ (complex-r a) (complex-r b))
(unsafe-fl+ (complex-i a) (complex-i b))))
(define (complex* a b)
(complex (unsafe-fl- (unsafe-fl* (complex-r a) (complex-r b))
(unsafe-fl* (complex-i a) (complex-i a)))
(unsafe-fl+ (unsafe-fl* (complex-r a) (complex-i b))
(unsafe-fl* (complex-i a) (complex-r b)))))
(define (mandelbrot n z)
(if (unsafe-fx= n 0) z
(mandelbrot (unsafe-fx- n 1) (complex+ (complex* z z) c))))
(let*
((n (string->number (vector-ref (current-command-line-arguments) 0)))
(debug (string=? "debug" (vector-ref (current-command-line-arguments) 1)))
(z0 (complex 0.0 0.0))
(z (mandelbrot n z0)))
(when debug (printf (number->string (unsafe-make-flrectangular (complex-r z) (complex-i z))))))
До sbcl, конечно, далеко, но хотя бы быстрее питона.
Исходная версия monk, :
На моём компьютере (Racket 6.11, Python 3.5.1+) твои примеры:
$ time racket mand.rkt 10000000 1
real 0m6,321s
user 0m6,108s
sys 0m0,224s
$ time python3 mand.py 10000000 1
real 0m4,887s
user 0m4,820s
sys 0m0,020s
Если проставить типы для Racket (иначе он комплексную арифметику делает в предположении, что там могут быть числа произвольной точности), тогда
$ time racket mand2.rkt 10000000 1
real 0m1,733s
user 0m1,636s
sys 0m0,100s
$ cat mand2.rkt #lang racket/base (require racket/unsafe/ops)
(struct complex (r i))
(define c (complex 0.04 0.01))
(define (complex+ a b) (complex (unsafe-fl+ (complex-r a) (complex-r b)) (unsafe-fl+ (complex-i a) (complex-i b))))
(define (complex* a b) (complex (unsafe-fl- (unsafe-fl* (complex-r a) (complex-r b)) (unsafe-fl* (complex-i a) (complex-i a))) (unsafe-fl+ (unsafe-fl* (complex-r a) (complex-i b)) (unsafe-fl* (complex-i a) (complex-r b)))))
(define (mandelbrot n z) (if (unsafe-fx= n 0) z (mandelbrot (unsafe-fx- n 1) (complex+ (complex* z z) c))))
(let* ((n (string->number (vector-ref (current-command-line-arguments) 0))) (debug (string=? «debug» (vector-ref (current-command-line-arguments) 1))) (z0 (complex 0.0 0.0)) (z (mandelbrot n z0))) (when debug (printf (number->string (unsafe-make-flrectangular (complex-r z) (complex-i z))))))
До sbcl, конечно, далеко, но хотя бы быстрее питона.