Welche Zweitsprache? Python oder Perl?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
wanne
Moderator
Beiträge: 7447
Registriert: 24.05.2010 12:39:42

Re: Welche Zweitsprache? Python oder Perl?

Beitrag von wanne » 14.02.2014 13:25:55

peschmae hat geschrieben:Falls jemand nach einem Beispiel für die Unleserlichkeit von Perl gefragt hätte, wäre das die Richtige Antwort gewesen ;)
Ich finde das hundert mal verständlicher als die oben genannte rekursive Variante.

Ich habe gerade mal gegoogelt wie man das in python macht:

Code: Alles auswählen

def mul (a,b):
        return a * b

def fakt(n):
        return reduce(mul,range(1,n+1))

print(fakt(5))
Eigentlich nicht viel uneleganter. Nur, dass dank der dämlichen Einrückregel aus {$a * $b} gleich 3 volle Zeilen werden.
PS: kann man python dazu bringen, dass es etwas schönere Fehlermeldungen ausgibt als: "invalid Syntax"?

@Liffi: Wie unleserlich in keiner anderen Programmiersprache hättest du so schnell deutlich machen können, dass es um Bierflaschen geht. Das kann ich trotz Kurzsichtigkeit noch aus 50m erkennen.
rot: Moderator wanne spricht, default: User wanne spricht.

Colttt
Beiträge: 2983
Registriert: 16.10.2008 23:25:34
Wohnort: Brandenburg
Kontaktdaten:

Re: Welche Zweitsprache? Python oder Perl?

Beitrag von Colttt » 14.02.2014 14:46:27

also ich werde jetzt wahrscheinlich mit python angucken.. vor allem weil ich mir bcfg2 näher angucken möchte..
Debian-Nutzer :D

ZABBIX Certified Specialist

Benutzeravatar
catdog2
Beiträge: 5352
Registriert: 24.06.2006 16:50:03
Lizenz eigener Beiträge: MIT Lizenz

Re: Welche Zweitsprache? Python oder Perl?

Beitrag von catdog2 » 14.02.2014 18:04:01

Eigentlich nicht viel uneleganter. Nur, dass dank der dämlichen Einrückregel aus {$a * $b} gleich 3 volle Zeilen werden.
1. Die ist nicht dämlich
2. Kann man auch anders schreiben z.B.:

Code: Alles auswählen

def fakt(n):
        return reduce(lambda x, y: x*y,range(1,n+1))
Oder die funktion eben ganz in einer Zeile:

Code: Alles auswählen

fakt = lambda n: reduce(lambda x, y: x*y,range(1,n+1))
//edit: bei def muss man nicht mal eine newline machen, also geht auch

Code: Alles auswählen

def fakt(n): return reduce(lambda x, y: x*y,range(1,n+1))
Kein Funktionsoverhead kein nichts. Und dabei vermutlich um längen schneller.
Da würde ich mich nicht so weit aus dem Fenster lehen. Bei perl bist du an den perl Interpreter gebunden weil die Sprache nicht formal definiert ist. Bei python musst du nicht zwangsläufig die vergleichsweise langsame Referenzimplementierung benutzen sondern kannst z.B. pypy verwenden.
Perl ist öfters auf Systemen installiert(Linux,solaris,BSD).. Python ist logischer zu programmieren und ist mächtiger (wenn man sich die Softwareprojekte so anschaut)
Python ist zumindest im Linux Bereich ähnlich verbreitet alleine schon weil viele Distributionen tools mitliefern, die das benutzen.
Wie schon angedeutet ist Python halt eine sauber formal definierte Sprache und perl das exakte Gegenteil davon. Mag zwar im ersten Moment toll erscheinen, dass praktisch alles irgendwie funktioniert aber man tut sich sicherlich keinen Gefallen, gerade wenn es mal komplexer als ein paar Zeilen wird.
Unix is user-friendly; it's just picky about who its friends are.

wanne
Moderator
Beiträge: 7447
Registriert: 24.05.2010 12:39:42

Re: Welche Zweitsprache? Python oder Perl?

Beitrag von wanne » 14.02.2014 18:39:36

catdog2 hat geschrieben:
Kein Funktionsoverhead kein nichts. Und dabei vermutlich um längen schneller.
Da würde ich mich nicht so weit aus dem Fenster lehen. Bei perl bist du an den perl Interpreter gebunden weil die Sprache nicht formal definiert ist. Bei python musst du nicht zwangsläufig die vergleichsweise langsame Referenzimplementierung benutzen sondern kannst z.B. pypy verwenden.
Also ich habe gerade mal enchmarken wollen. Die rekursive Variante gibt schon vor 1000 auf. Geschwindigkeit ist also kein Problem.
Allerdings ist die von dir gepostete Variante um Lengen schneller als meine perl variante, wenn man auf bigintegers umstellt.
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
novalix
Beiträge: 1908
Registriert: 05.10.2005 12:32:57
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: elberfeld

Re: Welche Zweitsprache? Python oder Perl?

Beitrag von novalix » 15.02.2014 18:29:21

wanne hat geschrieben:Also ich habe gerade mal enchmarken wollen. Die rekursive Variante gibt schon vor 1000 auf.
Wow, da hätte ich doch ein wenig mehr Durchhaltevermögen erwartet.
Auf Debiansbcl:

Code: Alles auswählen

(defun factorial (n)
    (reduce #'*(loop for i from 1 to n collect i)))
Benchmark (10.000):

Code: Alles auswählen

(time (factorial 10000))
Evaluation took:
  0.111 seconds of real time
  0.072000 seconds of total run time (0.060000 user, 0.012000 system)
  [ Run times consist of 0.008 seconds GC time, and 0.064 seconds non-GC time. ]
  64.86% CPU
  153,328,020 processor cycles
Die rekursive und die tail recursive Variante liefern recht ähnliche Ergebnisse.
A propos Ergebnis: Das poste ich hier nicht. Kann sich ja jeder selbst ausrechnen.
Das Wem, Wieviel, Wann, Wozu und Wie zu bestimmen ist aber nicht jedermannns Sache und ist nicht leicht.
Darum ist das Richtige selten, lobenswert und schön.

wanne
Moderator
Beiträge: 7447
Registriert: 24.05.2010 12:39:42

Re: Welche Zweitsprache? Python oder Perl?

Beitrag von wanne » 15.02.2014 20:18:17

Compilierende Sprachen sind ungerecht. Und endrekursive Varianten in Lisp und C zählen nur als Interativ:

C:

Code: Alles auswählen

#include <stdio.h>
#include <gmp.h>

int main(int arg, char** argv)
{
        if(arg!=2)
                exit(1);
        unsigned long to = atol(argv[1]);
        MP_INT num;
        mpz_init_set_ui(&num,2UL);
        for(unsigned long i=3;i<=to;i++)
                mpz_mul_ui(&num,&num,i);
        char* out=NULL;
        printf("0x%s",mpz_get_str(out,16,&num));
}

Code: Alles auswählen

$ time ./cfakt 10000 > /dev/null 

real    0m0.016s
user    0m0.008s
sys     0m0.004s

Code: Alles auswählen

$ time ./cfakt 100000 > /dev/null 

real    0m2.168s
user    0m1.820s
sys     0m0.000s
rot: Moderator wanne spricht, default: User wanne spricht.

Benutzeravatar
novalix
Beiträge: 1908
Registriert: 05.10.2005 12:32:57
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: elberfeld

Re: Welche Zweitsprache? Python oder Perl?

Beitrag von novalix » 16.02.2014 00:29:17

An die Laufgeschwindigkeit von C kommt man mit Lisp nicht wirklich ran.
Ich mit Sicherheit nicht:

Code: Alles auswählen

(time (fact-tail 30000))
Evaluation took:
  0.879 seconds of real time
  0.896000 seconds of total run time (0.888000 user, 0.008000 system)
  [ Run times consist of 0.080 seconds GC time, and 0.816 seconds non-GC time. ]
  101.93% CPU
  1,752,832,040 processor cycles
  796,106,064 bytes consed
Endrekursiv mit Typendeklaration.
An dem C-Beispiel sieht man aber auch, dass es recht aufwendig ist, optimierte Programme zu schreiben. Optimierter Lisp code sieht dann auch irgendwann aufgeblähter und kryptischer aus.
Bleibt der Vorteil, dass man mit Lisp arbeiten kann wie mit einer interpretierten Skript-Sprache, auch wenn wie im Falle von sbcl jeglicher code on the fly kompiliert wird. Die Performancewerte liegen dabei meist näher an C als an Perl et al.
Das Wem, Wieviel, Wann, Wozu und Wie zu bestimmen ist aber nicht jedermannns Sache und ist nicht leicht.
Darum ist das Richtige selten, lobenswert und schön.

Antworten