Project Euler

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Project Euler

Δημοσίευσηαπό pmav99 » 07 Αύγ 2011, 00:22

Off topic:
Απορία επειδή ανέβασες 2 εκδοχές του κώδικα στη C. Στη C o αριθμός των συναρτήσεων δεν είναι πρακτικά αδιάφορος? Στην python κάθε function call έχει overhead αλλά νόμιζα ότι στις compiled γλώσσες δεν υπάρχει τέτοιο θέμα. Ή τουλάχιστον όχι τόσο έντονα.
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

Re: Project Euler

Δημοσίευσηαπό migf1 » 07 Αύγ 2011, 00:24

Off topic:
Έχει και στη C overhead (αλλά η C θα έπρεπε να είναι πολύ πιο γρήγορη από την Python είτε με είτε χωρίς συναρτήσεις)
Τελευταία επεξεργασία από migf1 και 07 Αύγ 2011, 01:05, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Project Euler

Δημοσίευσηαπό pmav99 » 07 Αύγ 2011, 00:28

Κοίτα για το I/O αν δεν κάνω λάθος, τα modules που χρησιμοποιούνται είναι υλοποιημένα σε C και βελτιστοποιημένα ως εκεί που δεν πάει. Το ίδιο ισχύει και για sorted() καθώς και για list comprehensions/generators που χρησιμοποιούν τα one/two liners. Οπότε δεν είναι τόσο περίεργο να είναι γρήγορη η python σε αυτά. Στο number crunching είναι που ζορίζεται αλλά και για εκεί υπάρχουν λύσεις (numpy που και αυτό γραμμένο σε C είναι).
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

Re: Project Euler

Δημοσίευσηαπό migf1 » 07 Αύγ 2011, 00:37

Off topic:
Εμένα γιατί μου βγάζει syntax error ο κώδικας της python?

Αρχείο: euler22.py
Κώδικας: Επιλογή όλων
names = open("names.txt").read().replace('"','').split(",")
print sum( (i+1) * sum( 1+ord(c)-ord("A") for c in n ) for i,n in enumerate(sorted(names)) )


Εικόνα
Τελευταία επεξεργασία από migf1 και 07 Αύγ 2011, 00:55, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Project Euler

Δημοσίευσηαπό migf1 » 07 Αύγ 2011, 00:44

Off topic:
Άκυρο, το έφτιαξα :)
Τελευταία επεξεργασία από migf1 και 07 Αύγ 2011, 00:55, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Project Euler

Δημοσίευσηαπό migf1 » 07 Αύγ 2011, 00:48

Off topic:
Και είναι και λογικά πλέον και τα benchmarks, τουλάχιστον στα XP που έχω εδώ (από δευτέρα θα δω και σε Windows 7). Δεν είχε λογική να είναι ταχύτερη η Python από την C :clap:

Εικόνα

ΥΓ. btw, την CPython 3.2 κατέβασα
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Project Euler

Δημοσίευσηαπό pmav99 » 07 Αύγ 2011, 02:26

Εγώ έτρεχα python 2. Καλά εννοείται ότι βελτιστοποιημένη C θα είναι πιο γρήγορη. Δεν τίθεται ζήτημα επ' αυτού.
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

Re: Project Euler

Δημοσίευσηαπό migf1 » 07 Αύγ 2011, 02:37

Δεν είναι βελτιστοποιημένη, ο ίδιος κώδικας είναι που έτρεξες κι εσύ, απλά τον έχω ονομάσει _faster επειδή έχει λιγότερες συναρτήσεις.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Project Euler

Δημοσίευσηαπό pmav99 » 07 Αύγ 2011, 12:44

Πήρα από το project Euler διάφορες εκδοχες του προγράμματος και τις ανέβασα εδώ. Το script τρέχει σε Python2, Python3 και PyPy. Χρησιμοποιώντας το module timeit, τρέχει την κάθε συνάρτηση 5 φορές, και εκτυπώνει τον καλύτερο χρόνο εκτέλεσής της. Μόνο της συνάρτησης. Τα imports, η εκκίνηση του python interpreter κτλ δε χρονομετρούνται. Αυτός είναι ο στάνταρ τρόπος της python για να συγκρίνεις την ταχύτητα εκτέλεσης snippets.

Τα αποτέλεσματα φαίνονται στο επόμενο spoiler. Για τις συγκεκριμένες συναρτήσεις η Python3 είναι πιο αργή από την Python2 σε όλες τις περιπτώσεις. Το pypy είναι πιο γρήγορο αλλά αυτό είναι αναμενόμενο (μάλιστα η συνάρτηση με τα regex είναι η γρηγορότερη από όλες!)
Spoiler: show
Κώδικας: Επιλογή όλων
--------------------------------------------------
System information
2.7.2 (default, Jun 29 2011, 11:17:09)
[GCC 4.6.1]
--------------------------------------------------
Time comparison
--------------------------------------------------
simple => 0.0183138847351
simple2 => 0.015594959259
simple3 => 0.019210100174
list_generators => 0.0208940505981
list_comprehension => 0.0214910507202
lambdas => 0.0284719467163
lambdas2 => 0.0307831764221
lambdas3 => 0.0268630981445
pyeuler => 0.0196161270142
pyeuler2 => 0.0172610282898
regex => 0.0164489746094

--------------------------------------------------
System information
3.2.1 (default, Jul 11 2011, 12:37:49)
[GCC 4.6.1]
--------------------------------------------------
Time comparison
--------------------------------------------------
simple => 0.023198843002319336
simple2 => 0.018476009368896484
simple3 => 0.02368617057800293
list_generators => 0.02426600456237793
list_comprehension => 0.0240631103515625
lambdas => 0.02970099449157715
lambdas2 => 0.041773080825805664
lambdas3 => 0.028264999389648438
pyeuler => 0.020607948303222656
pyeuler2 => 0.021348953247070312
regex => 0.020405054092407227

--------------------------------------------------
System information
2.7.1 (?, May 28 2011, 20:50:21)
[PyPy 1.5.0-alpha0 with GCC 4.6.0]
--------------------------------------------------
Time comparison
--------------------------------------------------
simple => 0.00901508331299
simple2 => 0.00927400588989
simple3 => 0.011815071106
list_generators => 0.0234549045563
list_comprehension => 0.0225760936737
lambdas => 0.011803150177
lambdas2 => 0.0216839313507
lambdas3 => 0.012552022934
pyeuler => 0.0253591537476
pyeuler2 => 0.0137112140656
regex => 0.00851392745972

Συγκρίνοντας τώρα με την time (καλύτερος χρόνος user από 5 εκτελέσεις), βλέπουμε ότι η ταχύτητα εκτέλεσης είναι:
Κώδικας: Επιλογή όλων
Python 2 < C < Python 3 < PyPy

Δηλαδή η Python2 εξακολουθεί να είναι πιο γρήγορη από την C ενώ η Python3 πιο αργή.
Spoiler: show
Κώδικας: Επιλογή όλων
$ time python2 -c "from problem_22 import simple2; print(simple2())"
871198282

real 0m0.052s
user 0m0.040s
sys 0m0.010s

$ time python3 -c "from problem_22 import simple2; print(simple2())"
871198282

real 0m0.099s
user 0m0.077s
sys 0m0.020s

$ time pypy -c "from problem_22 import simple2; print(simple2())"
871198282

real 0m0.220s
user 0m0.197s
sys 0m0.020s

$ time ./problem_22
871198282

real 0m0.074s
user 0m0.070s
sys 0m0.003s


Επειδή σαφώς το overhead του python interpreter θα είναι σημαντικό. Δοκίμασα να το χρονομετρήσω. Όπως φαίνεται το pypy αργεί να ξεκινήσει για αυτό και πατώνει στην time. Στην Python3 είναι σχεδόν το διπλάσιο από αυτό της Python2. Αν αφαιρέσουμε το overhead αυτό από τους χρόνους της time για την πλήρη εκτέλεση του προγράμματος, βλέπουμε ότι η python2 και η python3 είναι πολύ κοντά, γεγονός που φάνηκε και από τη σύγκριση με το timeit.
Spoiler: show
Κώδικας: Επιλογή όλων
$ time python2 -c ""

real 0m0.030s
user 0m0.017s
sys 0m0.010s

$ time python3 -c ""

real 0m0.077s
user 0m0.060s
sys 0m0.017s

$ time pypy -c ""

real 0m0.172s
user 0m0.153s
sys 0m0.020s
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

Re: Project Euler

Δημοσίευσηαπό migf1 » 07 Αύγ 2011, 21:33

Βασικά είναι αδύνατον οποιαδήποτε Python να είναι ταχύτερη από την C.

pmav99 έγραψε:Πήρα από το project Euler διάφορες εκδοχες του προγράμματος και τις ανέβασα εδώ. Το script τρέχει σε Python2, Python3 και PyPy. Χρησιμοποιώντας το module timeit, τρέχει την κάθε συνάρτηση 5 φορές, και εκτυπώνει τον καλύτερο χρόνο εκτέλεσής της. Μόνο της συνάρτησης. Τα imports, η εκκίνηση του python interpreter κτλ δε χρονομετρούνται. Αυτός είναι ο στάνταρ τρόπος της python για να συγκρίνεις την ταχύτητα εκτέλεσης snippets.

Τι είναι τα imports; Αν είναι οι εξωτερικές βιβλιοθήκες, τότε χωρίς αυτές το πρόγραμμα δεν τρέχει, οπότε δεν πρέπει να τις εξαιρούμε.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι