LINUX.ORG.RU

Python vs Lisp. Расстановка точек


0

1

питон:

den@ira-desktop:~/work/test$ time python -O test.py 
('answer: ', 39)

real	0m33.035s
user	0m32.890s
sys	0m0.084s
den@ira-desktop:~/work/test$

clisp:

den@ira-desktop:~/work/test$ time clisp test.lsp
39

real	2m44.491s
user	2m42.970s
sys	0m1.464s
den@ira-desktop:~/work/test$

def test():
    r = 0
    for i in range(0, 10000):
        for j in range(0, 10000):
            r = (r + (i * j) % 100) % 47
    return r
r = test()
print("answer: ", r)
(defun test ()
    (setq r 0)
    (dotimes (i 10000 r)
        (dotimes (j 10000 r)
            (setq r (mod (+ r (mod (* i j) 100)) 47))
        )
    )
)

(write (test))

а теперь докажите, что лисп не тормознутое УГ

феерическая расстановка точек над лиспом?

jtootf ★★★★★ ()

Какой ужас! Вы хотите новую тему на несколько тысяч комментариев?

anonymous ()

Что ж ты тормозной такой питон используешь, надо cpython или unladden swallow. Тогда лисп еще смешнее покажется.

anonymous ()

На сколько помню, там модули входящие в сам питоновский скрипт компилируются в байткод. Это наверное может дать +% к выполнению скрипта?

CruncH ()
Ответ на: комментарий от CruncH

Почти любой нормальный динамический язык может компилироваться в байт-код. Если ТС не компилил в байт-код, то лисперы набегут и начнут доказывать что автор - малолетний школьник ибо проигрыш лиспа будет ещё более очевиден.

tia ()

> а теперь докажите, что лисп не тормознутое УГ

Не стал даже смотреть код, просто не используй clisp - это интерпретатор, используй нормальную компилирующую реализацию: SBCL или ClozureCL

archimag ★★★ ()
Ответ на: комментарий от CruncH
den@ira-desktop:~/work/test$ time python test2.py 
('answer: ', 39)

real	0m32.305s
user	0m32.162s
sys	0m0.084s
den@ira-desktop:~/work/test$

без pyc и pyo

antony986 ()

Ну вы даете... такой кривой код, да еще и на одном из самых медленных лиспов. Сейчас проведу бенчмарк и отпишусь.

dmitry_vk ★★★ ()

C++ круче всех

#include <iostream>
using namespace std;

int test()
{
	int r = 0;
	for (int i = 0; i < 10000; ++i)
		for (int j = 0; j < 10000; ++j)
			r = (r + (i * j) % 100) % 47;
	return r;
}
int main()
{
	int r = test();
	cout << "answer: " <<  r << endl;
	return 0;
}
answer: 39

real	0m0.681s
user	0m0.680s
sys	0m0.000s

На Питоне пример даёт

('answer: ', 39)

real	0m25.078s
user	0m24.750s
sys	0m0.252s
anonymous ()
Ответ на: комментарий от dmitry_vk

На моей машине SBCL решает эту задачу примерно в 20 раз быстрее, чем Python

archimag ★★★ ()

А пыхапэ смотрит на вас на на Г

#!/usr/bin/php
<?php

function test()
{
    $r = 0;
    for ($i = 0; $i < 10000; $i++) {
        for ($j = 0; $j < 10000; $j++) {
            $r = ($r + ($i * $j) % 100) % 47;
        }
    }
    return $r;
}

$r = test();
echo "answer: $r\n";
$ time ./test.py
('answer: ', 39)

real    0m32.278s
user    0m32.032s
sys     0m0.015s

$ time ./test.php
answer: 39

real    0m19.797s
user    0m19.723s
sys     0m0.009s

PS: Завершения аналога на руби так и не смог дождаться - прибил.
PPS: Про аналог на C++ скромно умолчу...

bibi ()
Ответ на: комментарий от dmitry_vk

На моей машине (с теми же файлами, без изменений): [code=bash] dvk@localhost ~/tmp $ time python test.py ('answer: ', 39)

real   0m31.934s user   0m29.036s sys   0m0.047s dvk@localhost ~/tmp $ time sbcl --load test.lisp --eval "(quit)" This is SBCL 1.0.35.gentoo-r0, an implementation of ANSI Common Lisp. More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty. It is mostly in the public domain; some portions are provided under BSD-style licenses. See the CREDITS and COPYING files in the distribution for more information. ; loading system definition from ; /usr/share/common-lisp/systems/asdf-binary-locations.asd into ; #<PACKAGE «ASDF0»> ; registering #<SYSTEM ASDF-BINARY-LOCATIONS {10031D0681}> as ; ASDF-BINARY-LOCATIONS

; in: LAMBDA NIL ; (SETQ R 0) ; ; caught WARNING: ; undefined variable: R ; ; compilation unit finished ; Undefined variable: ; R ; caught 1 WARNING condition 39 real   1m16.391s user   1m16.010s sys   0m0.176s [/code]

С минимальными изменениями, обеспечивающими корректность программы (r надо объявлять локальной переменной, это ж надо додуматься до использования UB в программе):

[code=bash] dvk@localhost ~/tmp $ time sbcl --load test2.lisp --eval "(quit)" This is SBCL 1.0.35.gentoo-r0, an implementation of ANSI Common Lisp. More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty. It is mostly in the public domain; some portions are provided under BSD-style licenses. See the CREDITS and COPYING files in the distribution for more information. ; loading system definition from ; /usr/share/common-lisp/systems/asdf-binary-locations.asd into ; #<PACKAGE «ASDF0»> ; registering #<SYSTEM ASDF-BINARY-LOCATIONS {10031D0681}> as ; ASDF-BINARY-LOCATIONS 39 real   0m8.747s user   0m8.659s sys   0m0.060s [/code]

Теперь немного «подсластим» код: [code=bash] dvk@localhost ~/tmp $ time sbcl --load test3.lisp --eval "(quit)" This is SBCL 1.0.35.gentoo-r0, an implementation of ANSI Common Lisp. More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty. It is mostly in the public domain; some portions are provided under BSD-style licenses. See the CREDITS and COPYING files in the distribution for more information. ; loading system definition from ; /usr/share/common-lisp/systems/asdf-binary-locations.asd into ; #<PACKAGE «ASDF0»> ; registering #<SYSTEM ASDF-BINARY-LOCATIONS {10031D0681}> as ; ASDF-BINARY-LOCATIONS 39 real   0m6.549s user   0m6.286s sys   0m0.061s [/code]

Дальше оптимизировать просто лень.

Файлы:

test2.lisp: [code=lisp] (defun test () (let ((r 0)) (dotimes (i 10000 r) (dotimes (j 10000 r) (setf r (mod (+ r (mod (* i j) 100)) 47)))) r)) (write (test)) [/code]

test3.lisp: [code=lisp] (defun test () (declare (optimize (speed 3) (debug 0) (safety 0))) (let ((r 0)) (declare (type fixnum r)) (dotimes (i 10000 r) (declare (type fixnum i)) (dotimes (j 10000 r) (declare (type fixnum j)) (setf r (mod (+ r (mod (* i j) 100)) 47)))) r)) (write (test)) [/code]

dmitry_vk ★★★ ()
Ответ на: комментарий от dmitry_vk

На моей машине (с теми же файлами, без изменений):

dvk@localhost ~/tmp $ time python test.py
('answer: ', 39)

real	0m31.934s
user	0m29.036s
sys	0m0.047s
dvk@localhost ~/tmp $ time sbcl --load test.lisp --eval "(quit)"
This is SBCL 1.0.35.gentoo-r0, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
; loading system definition from
; /usr/share/common-lisp/systems/asdf-binary-locations.asd into
; #<PACKAGE "ASDF0">
; registering #<SYSTEM ASDF-BINARY-LOCATIONS {10031D0681}> as
; ASDF-BINARY-LOCATIONS

; in: LAMBDA NIL
;     (SETQ R 0)
; 
; caught WARNING:
;   undefined variable: R
; 
; compilation unit finished
;   Undefined variable:
;     R
;   caught 1 WARNING condition
39
real	1m16.391s
user	1m16.010s
sys	0m0.176s

С минимальными изменениями, обеспечивающими корректность программы (r надо объявлять локальной переменной, это ж надо додуматься до использования UB в программе):

dvk@localhost ~/tmp $ time sbcl --load test2.lisp --eval "(quit)"
This is SBCL 1.0.35.gentoo-r0, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
; loading system definition from
; /usr/share/common-lisp/systems/asdf-binary-locations.asd into
; #<PACKAGE "ASDF0">
; registering #<SYSTEM ASDF-BINARY-LOCATIONS {10031D0681}> as
; ASDF-BINARY-LOCATIONS
39
real	0m8.747s
user	0m8.659s
sys	0m0.060s

Теперь немного «подсластим» код:

dvk@localhost ~/tmp $ time sbcl --load test3.lisp --eval "(quit)"
This is SBCL 1.0.35.gentoo-r0, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
; loading system definition from
; /usr/share/common-lisp/systems/asdf-binary-locations.asd into
; #<PACKAGE "ASDF0">
; registering #<SYSTEM ASDF-BINARY-LOCATIONS {10031D0681}> as
; ASDF-BINARY-LOCATIONS
39
real	0m6.549s
user	0m6.286s
sys	0m0.061s

Дальше оптимизировать просто лень.

Файлы:

test2.lisp:

(defun test ()
  (let ((r 0))
    (dotimes (i 10000 r)
      (dotimes (j 10000 r) 
        (setf r (mod (+ r (mod (* i j) 100)) 47))))
    r)) 
 
(write (test)) 

test3.lisp:

(defun test ()
  (declare (optimize (speed 3) (debug 0) (safety 0)))
  (let ((r 0))
    (declare (type fixnum r))
    (dotimes (i 10000 r) 
      (declare (type fixnum i))
      (dotimes (j 10000 r) 
        (declare (type fixnum j))
        (setf r (mod (+ r (mod  (* i j) 100)) 47))))
    r)) 
 
(write (test)) 

dmitry_vk ★★★ ()

заменить setq на let, или добавить перед функцией (defvar r 0),

и включить оптимизации (declaim (optimize (speed 3) (safety 0) (debug 0)))

(declaim (optimize (speed 3) (safety 0) (debug 0)))

(defvar r 0)

(defun test () 
  (setq r 0) 
  (dotimes (i 10000 r) 
    (dotimes (j 10000 r) 
      (setq r (mod (+ r (mod (* i j) 100)) 47)))))

(write (test))


time sbcl --script 1.lisp
39
real	0m3.824s
user	0m3.804s
sys	0m0.012s


time python -O 1.py 
('answer: ', 39)

real	0m32.951s
user	0m32.922s
sys	0m0.012s
anonymous ()
Ответ на: комментарий от dmitry_vk

Да у тебя половину времени просто накладные расходы на запуск SBCL и компиляцию кода съели :) А если просто:

(time (test))
archimag ★★★ ()
Ответ на: комментарий от archimag

и не стыдно, а?


den@ira-desktop:~/work/test$ sbcl --noinform
* (compile-file "test.lsp" :output-file "testlsp")

; compiling file "/home/den/work/test/test.lsp" (written 08 FEB 2010 10:44:28 PM):
; compiling (DEFUN TEST ...)
; compiling (WRITE (TEST))
; file: /home/den/work/test/test.lsp
; in: DEFUN TEST
;     (SETQ R 0)
; 
; caught WARNING:
;   undefined variable: R
; 
; compilation unit finished
;   Undefined variable:
;     R
;   caught 1 WARNING condition


; /home/den/work/test/testlsp.fasl written
; compilation finished in 0:00:00.034
#P"/home/den/work/test/testlsp.fasl"
T
T
* den@ira-desktop:~/work/test$ chmod +x testlsp.fasl 
den@ira-desktop:~/work/test$ time ./testlsp.fasl
39
real	1m22.454s
user	1m22.161s
sys	0m0.140s
den@ira-desktop:~/work/test$ cat test.lsp 
(defun test ()
    (setq r 0)
    (dotimes (i 10000 r)
        (dotimes (j 10000 r)
            (setq r (mod (+ r (mod (* i j)100)) 47))
        )
    )
)

(write (test))

den@ira-desktop:~/work/test$
antony986 ()
(defun test ()
  (declare (optimize (speed 3) (safety 0) (debug 0)))
  (let ((r 0))
    (dotimes (i 10000 r) 
      (dotimes (j 10000 r)
        (setq r (mod (+ r (mod (* i j) 100))
                     47))))))

(write (test))
[ ~/p/cl ] time sbcl < test.lisp
...
* 
TEST
* 39
39
* sbcl < test.lisp  4,02s user 0,08s system 78% cpu 5,218 total
[ ~/p/cl ] 
def test():
    r = 0
    for i in range(0, 10000):
        for j in range(0, 10000):
            r = (r + (i * j) % 100) % 47
    return r

r = test()

print("answer: ", r)
[ ~/p/python ] time python -O test.py
('answer: ', 39)
python -O test.py  19,03s user 0,03s system 99% cpu 19,112 total
[ ~/p/python ]

а теперь докажите, что пейтон не тормознутое УГ

=)

korvin_ ★★★★★ ()
Ответ на: комментарий от korvin_

> а теперь докажите, что пейтон не тормознутое УГ
> =)


сишники и сипиписники улыбнулись краем губ

lester ★★★★ ()
Ответ на: комментарий от dmitry_vk
(defun test ()
  (declare (optimize (speed 3) (debug 0) (safety 0))) 
  (let ((r 0)) 
    (declare (type fixnum r)) 
    (dotimes (i 10000 r)  
      (declare (type fixnum i)) 
      (dotimes (j 10000 r)  
        (declare (type fixnum j)) 
        (setf r (mod (+ r (mod  (* i j) 100)) 47)))) 
    (the fixnum r)))
  
(write (time (test)))
[ ~/p/cl ] sbcl --script test.lisp 
Evaluation took:
  2.433 seconds of real time
  2.420000 seconds of total run time (2.420000 user, 0.000000 system)
  99.47% CPU
  6,501,758,898 processor cycles
  0 bytes consed
  
39%                                                                   [ ~/p/cl ] 
korvin_ ★★★★★ ()
Ответ на: комментарий от antony986
CL-USER> (defun test () 
           (declare (optimize (speed 3) (debug 0)))
           (let ((r 0))
             (declare (type fixnum r))
             (dotimes (i 10000 r)
               (dotimes (j 10000 r) 
                 (setf r (mod (+ r (mod (* i j) 100)) 47))))))
TEST
CL-USER> (time (test))
Evaluation took:
  5.396 seconds of real time
  5.180323 seconds of total run time (5.164322 user, 0.016001 system)
  96.00% CPU
  9,724,182,570 processor cycles
  261,968 bytes consed
  
39
$ time python test.py 
('answer: ', 39)

real	1m15.052s
user	1m7.164s
sys	0m0.464s
archimag ★★★ ()
Ответ на: комментарий от lester

> сишники и сипиписники улыбнулись краем губ

рад, что заставил их улыбнуться, но мы же о питоне? =)

korvin_ ★★★★★ ()
Ответ на: комментарий от korvin_

Смешно все эти Питоны с Лиспами. Для скорости вычислений лучше С и С++ ничего нет. Т

anonymous ()
Ответ на: комментарий от lester

>сишники и сипиписники улыбнулись краем губ

Ха, а никто и не обещал волшебства

dmitry_vk ★★★ ()
Ответ на: комментарий от antony986

Читать умеешь? Писать-то не умеешь, мы уже поняли...

(defun test ()
  (let ((r 0))
    (dotimes (i 10000)
      (dotimes (j 10000)
        (declare ((unsigned-byte 29) r i j))
        (setq r (mod (+ r (mod (* i j) 100)) 47))))
    r))

(time (write (test)))
39
Evaluation took:
  2.716 seconds of real time
  2.711588 seconds of total run time (2.710588 user, 0.001000 system)
  99.85% CPU
  7,586,323,637 processor cycles
  0 bytes consed

Петон:

('answer: ', 39)

real    0m21.620s
user    0m21.086s
sys     0m0.017s

mv ★★★★★ ()
| r |
r := 0.
(Time millisecondsToRun: [    
    1 to: 10000 do: [:i |
        1 to: 10000 do: [:j |
            r := r + (((i * j) // 100) // 47) ]]]) displayNl.
r displayNl

Кто дождется - тот молодец

yoghurt ★★★★★ ()
Ответ на: комментарий от anonymous

> Смешно все эти Питоны с Лиспами. Для скорости вычислений лучше С и С++ ничего нет. Т

Фортран, не?

korvin_ ★★★★★ ()

Вот за что люблю лисперов - за комплекс осажденной крепости^W^W^Wвсегдашнюю готовность пофлеймить.

tailgunner ★★★★★ ()
Ответ на: комментарий от yoghurt

> Кто дождется - тот молодец

как это запустить?

korvin_ ★★★★★ ()
Ответ на: комментарий от korvin_

Давай на хаскеле! Олсо, на ди:

import std.stdio;
int test(){
 int r = 0;
 for(int i = 0; i< 10000; i++)
  for(int j = 0; j< 10000; j++)
   r = (r + (i * j) % 100) % 47;
 return r;
}

void main(){
 int r = test();
 writeln("answer: ", r);
}
iorlas@lastangel:~/tmp$ time ./dtestori 
answer: 39

real	0m3.436s
user	0m3.430s
sys	0m0.010s
iorlas@lastangel:~/tmp$ time python ./pytest.py
('answer: ', 39)

real	0m37.923s
user	0m37.900s
sys	0m0.030s
iorlas@lastangel:~/tmp$ time ./cpptesto3 
answer: 39

real	0m1.029s
user	0m1.020s
sys	0m0.000s
iorlas@lastangel:~/tmp$ time ./cpptest
answer: 39

real	0m1.908s
user	0m1.900s
sys	0m0.010s

tia ()
Ответ на: комментарий от tia

> Давай на хаскеле!

я ж тебе уже писал, что не знаю хаскелла =)

korvin_ ★★★★★ ()
Ответ на: комментарий от archimag

>Не стал даже смотреть код, просто не используй clisp - это интерпретатор, используй нормальную компилирующую реализацию: SBCL или ClozureCL

Так и сравниваются два интерпретатора. Зачем сравнивать JIT с интерпретатором, тут понятно JIT быстрее будет. Если SBCL брать, то уж лучше с Java. Или уже если о Python, то хотябы под psyco.

anonymous ()
Ответ на: комментарий от tia

> Кто тогда напишет на хаскеле? =/

tailgunner видимо =)

korvin_ ★★★★★ ()
Ответ на: комментарий от anonymous

> Так и сравниваются два интерпретатора. Зачем сравнивать JIT с
> интерпретатором, тут понятно JIT быстрее будет. Если SBCL брать,

> то уж лучше с Java. Или уже если о Python, то хотябы под psyco.


Сравнивать предложил не я. Но, скорость для лиспа долго была проблемой, уж слишком высокоуровневый. Над её решением долго работали, были разработаны эффективные схемы компиляции, которые и реализуются в ведущих реализациях. Собственно, вопрос о том, как сделать быстрый интерпретатор лиспа никого не интересует уже лет тридцать, все работают над компиляторами. Поэтому, вообще исследовать производительность интерпретаторов лиспа - это просто отвергать последние 30 лет его развития.

archimag ★★★ ()
Ответ на: комментарий от anonymous

> Или уже если о Python, то хотябы под psyco.

так в чем проблема-то? претензии к ТС =)

korvin_ ★★★★★ ()
Ответ на: комментарий от anonymous

SBCL не JIT
Это компилятор в нейтив.
JIT можно как раз в clisp, емнип

Love5an ()
Ответ на: комментарий от archimag

>Сравнивать предложил не я.

Предложили сравнивать интерпретаторы, а ты решил перевести спор на JIT vs интерпретатор. Что, по-моему, некорректно с технической стороны.

>Собственно, вопрос о том, как сделать быстрый интерпретатор лиспа никого не интересует уже лет тридцать, все работают над компиляторами.


Ты хочешь сказать интерпретаторы LISP уже никому не нужны? Я, помнится, так и не смог собрать SBCL под ARM (у кого-ть, кстати, это получилось?). А тот же clisp там прекрасно работает.

anonymous ()
Ответ на: комментарий от Love5an

>SBCL не JIT. Это компилятор в нейтив.

Тем более.

anonymous ()
Ответ на: комментарий от anonymous

> Я, помнится, так и не смог собрать SBCL под ARM (у кого-ть, кстати, это получилось?)

У кого-ть получилось прочитать документацию, в которой сказано, что в SBCL ARM не поддерживается.

mv ★★★★★ ()
Ответ на: комментарий от anonymous

> Предложили сравнивать интерпретаторы, а ты решил перевести спор на JIT vs интерпретатор. Что, по-моему, некорректно с технической стороны.

в топике ни слова о том, что сравнивается, только Python и Lisp

korvin_ ★★★★★ ()
Ответ на: комментарий от tailgunner

Да да да. Есть такое. Смешные клоуны говноеды, простите :)

tia ()
Ответ на: комментарий от archimag

Собственно, если использовать не только разработки «былых времен», но и новые техники компиляции, то тот же SBCL можно ускорить, так как генерирует он не самый лучший код.

>Ты хочешь сказать интерпретаторы LISP уже никому не нужны? Я, помнится, так и не смог собрать SBCL под ARM (у кого-ть, кстати, это получилось?).

Это проблема не компиляторов вообще, а проблема SBCL.

dmitry_vk ★★★ ()
Ответ на: комментарий от tia

Когда мне грустно, я читаю твои комментарии, и сразу настроение поднимается. Спасибо!

mv ★★★★★ ()
Ответ на: комментарий от anonymous

> Предложили сравнивать интерпретаторы

Нет, было предложено доказать

что лисп не тормознутое УГ

Что и было успешно показано

> а ты решил перевести спор на JIT vs интерпретатор

Какой ещё JIT? Никакого JIT в SBCL нет. А так см. выше.

> Ты хочешь сказать интерпретаторы LISP уже никому не нужны?

Только если поиграться. Да и то. В clisp даже основные пакеты ещё попробуй загрузить. Так что, о серьёзном использовании лучше не говорить.

archimag ★★★ ()
Ответ на: комментарий от anonymous

> Для скорости вычислений лучше С и С++ ничего нет.

Да ладно, Фортран рвет их как забаненный тузик грелку.

anonymous ()
Ответ на: комментарий от korvin_

Лучше вообще не запускать :) Как оказалось, в Smalltalk (по крайней мере, в GNU-реализации) как-то нестандартно считаются остатки от деления. Когда профикшу, выложу опять

yoghurt ★★★★★ ()
Ответ на: комментарий от archimag

>Не стал даже смотреть код, просто не используй clisp - это интерпретатор, используй нормальную компилирующую реализацию: SBCL или ClozureCL

Харе гнать на CLISP! :) Хорошая реализация, и я ей доволен. Маленький футпринт, быстрый старт, хорошая межплатформенная переносимость, скромные потребности в памяти. Компиляторы далеко не для всех задач требуются.

Zubok ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.