View difference between Paste ID: z8LxJTq4 and tmJQ0p8j
SHOW: | | - or go back to the newest paste.
1
(defun flatten (x &optional y)
2
  (declare (optimize (speed 3) (safety 0)))
3
  (cond
4
    ((null x)
5
     (cond
6
       ((null y) nil)
7
       ((listp (car y))
8
        (flatten (car y) (cdr y)))
9
       (t (cons (car y) (flatten (cdr y))))))
10
    ((listp (car x))
11
     (flatten (car x) (if y (list (cdr x) y) (cdr x))))
12
    (t (cons (car x) (flatten (cdr x) y)))))
13
14
(defun flatten-1 (l)
15
  (declare (optimize (speed 3) (safety 0)))
16
  (cond
17
    ((null l) nil)
18
    ((atom l) (list l))
19
    (t (loop for a in l appending (flatten-1 a)))))
20
21
(defun flatten-2 (l)
22
  (declare (optimize (speed 3) (safety 0)))
23
  (when l
24
    (if (atom l)
25
	(list l)
26
	(mapcan #'flatten-2 l))))
27
28
(defun flatten-3 (x)
29
  (declare (optimize (speed 3) (safety 0)))
30
  (do ((a x))
31
      ((null a))
32-
    (if (listp (car a))
32+
    (if (consp (car a))
33-
	(do ((b (car a) (cdr b))
33+
        (do ((b (car a) (cdr b))
34-
	     (c a)
34+
             (c a)
35-
	     (d (cdr a)))
35+
             (d (cdr a)))
36-
	    ((null b)
36+
            ((null b)
37-
	     (and (setf (cdr c) d) nil))
37+
             (and (setf (cdr c) d) nil))
38-
	  (setf (car c) (car b)
38+
          (setf (car c) (car b)
39-
		(cdr c) (cdr b)
39+
                (cdr c) (cdr b)
40-
		c (or (cdr c) c)))
40+
                c (or (cdr c) c)))
41-
	(setf a (cdr a)))) x)
41+
        (setf a (cdr a)))) x)
42-
		
42+
43-
;; 353 
43+
(defun flatten-4 (l)
44-
;; 2056 
44+
45-
;; 1230 
45+
46-
;; 63 
46+
47
    ((atom l) (list l))
48-
(let ((test (get-internal-real-time)))
48+
    (t (loop for a in l nconcing (flatten-4 a)))))
49-
  (dotimes (i 1e6)
49+
50-
    (flatten '(1 2 (3 4) (5 (6 (7 8) 9 a (10))) b (10.5 (1.6) (1.7)) 11)))
50+
(defun flatten-5 (x &aux (res (list nil)))
51-
  (print (- (get-internal-real-time) test))
51+
52-
  (setf test (get-internal-real-time))
52+
  (do ((x x) (y nil) (r res))
53-
  (dotimes (i 1e6)
53+
      (nil)
54-
    (flatten-2 '(1 2 (3 4) (5 (6 (7 8) 9 a (10))) b (10.5 (1.6) (1.7)) 11)))
54+
    (cond
55-
  (print (- (get-internal-real-time) test))
55+
      ((null x)
56-
  (setf test (get-internal-real-time))
56+
       (cond
57-
  (dotimes (i 1e6)
57+
         ((null y) (return-from flatten-5 (cdr res)))
58-
    (flatten-1 '(1 2 (3 4) (5 (6 (7 8) 9 a (10))) b (10.5 (1.6) (1.7)) 11)))
58+
         ((listp (car y))
59-
  (print (- (get-internal-real-time) test))
59+
          (setq x (car y) y (cdr y)))
60-
  (setf test (get-internal-real-time))
60+
         (t (rplacd r (list (car y)))
61-
  (dotimes (i 1e6)
61+
            (setq r (cdr r)
62-
    (flatten-3 '(1 2 (3 4) (5 (6 (7 8) 9 a (10))) b (10.5 (1.6) (1.7)) 11)))
62+
                  x (cdr y)
63-
  (print (- (get-internal-real-time) test)))
63+
                  y nil))))
64
      ((listp (car x))
65
       (setq y (if y (list (cdr x) y) (cdr x))
66
             x (car x)))
67
      (t (rplacd r (list (car x)))
68
         (setq r (cdr r)
69
               x (cdr x))))))
70
71
(defun test-flatten (data)
72
  (declare (optimize (speed 3) (safety 0)))
73
  (let ((test (get-internal-real-time)))
74
    (dotimes (i 1e6) (flatten data))
75
    (print (- (get-internal-real-time) test))
76
    (setf test (get-internal-real-time))
77
    (dotimes (i 1e6) (flatten-1 data))
78
    (print (- (get-internal-real-time) test))
79
    (setf test (get-internal-real-time))
80
    (dotimes (i 1e6) (flatten-2 data))
81
    (print (- (get-internal-real-time) test))
82
    (setf test (get-internal-real-time))
83
    (dotimes (i 1e6)
84
      (flatten-3 (copy-tree data)))
85
    (print (- (get-internal-real-time) test))
86
    (setf test (get-internal-real-time))
87
    (dotimes (i 1e6) (flatten-4 data))
88
    (print (- (get-internal-real-time) test))
89
    (setf test (get-internal-real-time))
90
    (dotimes (i 1e6) (flatten-5 data))
91
    (print (- (get-internal-real-time) test))
92
    (print "--------------------- finished")))
93
94
(let* ((data '(1 2 (3 4) (5 (6 (7 8) 9 a (10))) b (10.5 (1.6) (1.7)) 11))
95
       (data-1 (do ((i 10 (1- i)) (x))
96
		   ((zerop i) (return x))
97
		 (setf x (append x data))))
98
       (data-2 (do ((i 10 (1- i)) (x))
99
		   ((zerop i) (return x))
100
		 (setf x (append x data-1)))))
101
  (format t "data: ~s~&data-1: ~s~& data-2: ~s~&"
102
	  data data-1 data-2)
103
  (test-flatten data)
104
  (test-flatten data-1)
105
  (test-flatten data-2))
106
107
;; 890 
108
;; 2806 
109
;; 4735 
110
;; 686 
111
;; 811 
112
;; 414 
113
;; --------------------- finished
114
;; 3729 
115
;; 12915 
116
;; 21658 
117
;; 6584 
118
;; 7269 
119
;; 3391 
120
;; --------------------- finished
121
;; 50071 
122
;; 133508 
123
;; 215169 
124
;; 73918 
125
;; 70899 
126
;; 33164 
127
;; --------------------- finished