Πήρα από το project Euler διάφορες εκδοχες του προγράμματος και τις ανέβασα
εδώ. Το script τρέχει σε Python2, Python3 και PyPy. Χρησιμοποιώντας το module timeit, τρέχει την κάθε συνάρτηση 5 φορές, και εκτυπώνει τον καλύτερο χρόνο εκτέλεσής της. Μόνο της συνάρτησης. Τα imports, η εκκίνηση του python interpreter κτλ δε χρονομετρούνται. Αυτός είναι ο στάνταρ τρόπος της python για να συγκρίνεις την ταχύτητα εκτέλεσης snippets.
Τα αποτέλεσματα φαίνονται στο επόμενο spoiler. Για τις συγκεκριμένες συναρτήσεις η Python3 είναι πιο αργή από την Python2 σε όλες τις περιπτώσεις. Το pypy είναι πιο γρήγορο αλλά αυτό είναι αναμενόμενο (μάλιστα η συνάρτηση με τα regex είναι η γρηγορότερη από όλες!)
- Κώδικας: Επιλογή όλων
--------------------------------------------------
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 πιο αργή.
- Κώδικας: Επιλογή όλων
$ 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.
- Κώδικας: Επιλογή όλων
$ 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