Προγραμματισμός

Τι είναι το PyPy; Γρηγορότερη Python χωρίς πόνο

Η Python έχει κερδίσει τη φήμη ότι είναι ισχυρή, ευέλικτη και εύχρηστη. Αυτές οι αρετές έχουν οδηγήσει στη χρήση της σε μια τεράστια και αυξανόμενη ποικιλία εφαρμογών, ροών εργασίας και πεδίων. Αλλά ο σχεδιασμός της γλώσσας - η ερμηνευμένη φύση της, ο δυναμισμός του χρόνου εκτέλεσης - σημαίνει ότι η Python ήταν πάντα μια τάξη μεγέθους πιο αργή από τις μητρικές γλώσσες όπως C ή C ++.

Με τα χρόνια, οι προγραμματιστές έχουν βρει μια ποικιλία λύσεων για τους περιορισμούς ταχύτητας της Python. Για παράδειγμα, θα μπορούσατε να γράψετε εργασίες υψηλής έντασης απόδοσης στο C και να την τυλίξετε με την Python. πολλές βιβλιοθήκες μηχανικής μάθησης κάνουν ακριβώς αυτό. Ή θα μπορούσατε να χρησιμοποιήσετε το Cython, ένα έργο που σας επιτρέπει να πασπαλίζετε κώδικα Python με πληροφορίες τύπου χρόνου εκτέλεσης που σας επιτρέπει να μεταγλωττιστεί σε C.

Αλλά οι λύσεις δεν είναι ποτέ ιδανικές. Δεν θα ήταν υπέροχο αν μπορούσαμε απλώς να πάρουμε ένα υπάρχον πρόγραμμα Pythonόπως είναικαι να το τρέξετε δραματικά πιο γρήγορα; Αυτό ακριβώς σας επιτρέπει το PyPy.

Σχετικό βίντεο: Χρήση του χρόνου εκτέλεσης του PyPy για το Python

PyPy εναντίον CPython

Το PyPy είναι αντικαταστάτης του διερμηνέα Python, CPython. Ενώ το CPython μεταγλωττίζει το Python σε ενδιάμεσο bytecode που στη συνέχεια ερμηνεύεται από μια εικονική μηχανή, το PyPy χρησιμοποιεί σύνταξη just-in-time (JIT) για να μεταφράσει τον κώδικα Python σε μητρική γλώσσα μηχάνημα συναρμολόγησης.

Ανάλογα με την εργασία που εκτελείται, τα κέρδη απόδοσης μπορεί να είναι δραματικά. Κατά μέσο όρο, το PyPy επιταχύνει την Python κατά περίπου 7,6 φορές, με ορισμένες εργασίες να επιταχύνονται 50 φορές ή περισσότερο. Ο διερμηνέας CPython απλά δεν εκτελεί τα ίδια είδη βελτιστοποιήσεων με το PyPy, και πιθανότατα δεν θα το κάνει ποτέ, αφού αυτός δεν είναι ένας από τους σχεδιαστικούς στόχους του.

Το καλύτερο μέρος είναι ότι λίγη έως καθόλου προσπάθεια από την πλευρά του προγραμματιστή για να ξεκλειδώσετε τα κέρδη που παρέχει η PyPy. Απλώς ανταλλάξτε το CPython για το PyPy και ως επί το πλείστον έχετε τελειώσει. Υπάρχουν μερικές εξαιρέσεις, που συζητούνται παρακάτω, αλλά ο δηλωμένος στόχος της PyPy είναι να τρέξει τον υπάρχοντα, μη τροποποιημένο κώδικα Python και να του παρέχει μια αυτόματη ενίσχυση ταχύτητας.

Το PyPy υποστηρίζει προς το παρόν τόσο το Python 2 όσο και το Python 3, μέσω διαφορετικών ενσαρκώσεων του έργου. Με άλλα λόγια, πρέπει να κατεβάσετε διαφορετικές εκδόσεις του PyPy ανάλογα με την έκδοση του Python που θα εκτελείτε. Ο κλάδος Python 2 του PyPy έχει περάσει πολύ περισσότερο, αλλά η έκδοση Python 3 έχει φτάσει σε ταχύτητα από αργά. Προς το παρόν υποστηρίζει τόσο το Python 3.5 (ποιότητα παραγωγής) όσο και το Python 3.6 (ποιότητα beta).

Εκτός από την υποστήριξη όλων των βασικών γλωσσών Python, το PyPy συνεργάζεται με τη συντριπτική πλειονότητα των εργαλείων στο οικοσύστημα Python, όπωςκουκούτσι για συσκευασία ήvirtualenv για εικονικά περιβάλλοντα. Τα περισσότερα πακέτα Python, ακόμη και αυτά με μονάδες C, θα πρέπει να λειτουργούν ως έχουν, αν και υπάρχουν περιορισμοί που θα εξετάσουμε παρακάτω.

Πώς λειτουργεί το PyPy

Το PyPy χρησιμοποιεί τεχνικές βελτιστοποίησης που βρίσκονται σε άλλους μεταγλωττιστές just-in-time για δυναμικές γλώσσες. Αναλύει τα τρέχοντα προγράμματα Python για να προσδιορίσει τις πληροφορίες τύπου των αντικειμένων καθώς αυτά δημιουργούνται και χρησιμοποιούνται σε προγράμματα και στη συνέχεια χρησιμοποιεί αυτές τις πληροφορίες ως οδηγό για την επιτάχυνση των πραγμάτων. Για παράδειγμα, εάν μια συνάρτηση Python λειτουργεί μόνο με έναν ή δύο διαφορετικούς τύπους αντικειμένων, το PyPy δημιουργεί κώδικα μηχανήματος για να χειριστεί αυτές τις συγκεκριμένες περιπτώσεις.

Οι βελτιστοποιήσεις του PyPy αντιμετωπίζονται αυτόματα κατά το χρόνο εκτέλεσης, οπότε γενικά δεν χρειάζεται να τροποποιήσετε την απόδοσή του. Ένας προχωρημένος χρήστης μπορεί να πειραματιστεί με τις επιλογές γραμμής εντολών του PyPy για τη δημιουργία ταχύτερου κώδικα για ειδικές περιπτώσεις, αλλά σπάνια είναι απαραίτητο.

Το PyPy απομακρύνεται επίσης από τον τρόπο με τον οποίο το CPython χειρίζεται ορισμένες εσωτερικές λειτουργίες, αλλά προσπαθεί να διατηρήσει συμβατές συμπεριφορές. Για παράδειγμα, το PyPy χειρίζεται τη συλλογή απορριμμάτων διαφορετικά από το CPython. Δεν συλλέγονται αμέσως όλα τα αντικείμενα μόλις τεθούν εκτός εμβέλειας, επομένως ένα πρόγραμμα Python που εκτελείται κάτω από το PyPy μπορεί να εμφανίζει μεγαλύτερο αποτύπωμα μνήμης από ό, τι όταν εκτελείται σε CPython. Ωστόσο, μπορείτε να χρησιμοποιήσετε τα χειριστήρια συλλογής απορριμμάτων Python υψηλού επιπέδου που εκτίθενται μέσω του gc ενότητα, όπως gc. ενεργοποιήσιμο (), gc. απενεργοποίηση (), και gc.collect ().

Εάν θέλετε πληροφορίες σχετικά με τη συμπεριφορά JIT του PyPy κατά το χρόνο εκτέλεσης, το PyPy περιλαμβάνει μια ενότητα, pypyjit, που εκθέτει πολλά άγκιστρα JIT στην εφαρμογή Python. Εάν έχετε μια λειτουργία ή λειτουργική μονάδα που φαίνεται να έχει χαμηλή απόδοση με το JIT, pypyjit σας επιτρέπει να λάβετε λεπτομερή στατιστικά στοιχεία σχετικά με αυτό.

Μια άλλη ειδική μονάδα PyPy, __pypy__, εκθέτει άλλες λειτουργίες ειδικά για το PyPy, οπότε μπορεί να είναι χρήσιμη για τη σύνταξη εφαρμογών που αξιοποιούν αυτές τις λειτουργίες. Λόγω του δυναμικού χρόνου εκτέλεσης της Python, είναι δυνατή η κατασκευή εφαρμογών Python που χρησιμοποιούν αυτές τις λειτουργίες όταν το PyPy είναι παρόν και τις αγνοεί όταν δεν είναι.

Περιορισμοί PyPy

Μαγικό όπως φαίνεται το PyPy, δεν είναι μαγικό. Το PyPy έχει ορισμένους περιορισμούς που μειώνουν ή εξαλείφουν την αποτελεσματικότητά του για ορισμένα είδη προγραμμάτων. Δυστυχώς, το PyPy δεν αποτελεί εντελώς καθολική αντικατάσταση για το χρόνο εκτέλεσης CPython.

Το PyPy λειτουργεί καλύτερα με καθαρές εφαρμογές Python

Το PyPy είχε πάντα τις καλύτερες επιδόσεις με «καθαρές» εφαρμογές Python - δηλαδή, εφαρμογές γραμμένες σε Python και τίποτα άλλο. Τα πακέτα Python που διασυνδέονται με βιβλιοθήκες C, όπως το NumPy, δεν τα πήγαν καλά λόγω του τρόπου με τον οποίο το PyPy μιμείται τις εγγενείς δυαδικές διεπαφές του CPython.

Οι προγραμματιστές της PyPy έχουν ξεπεράσει αυτό το ζήτημα και έχουν κάνει το PyPy πιο συμβατό με την πλειονότητα των πακέτων Python που εξαρτώνται από επεκτάσεις C. Το Numpy, για παράδειγμα, λειτουργεί πολύ καλά με το PyPy τώρα. Αλλά αν θέλετε τη μέγιστη συμβατότητα με επεκτάσεις C, χρησιμοποιήστε το CPython.

Το PyPy λειτουργεί καλύτερα με προγράμματα μεγαλύτερης διάρκειας

Μία από τις παρενέργειες του τρόπου βελτιστοποίησης του PyPon από τα προγράμματα Python είναι ότι τα προγράμματα που εκτελούνται με μεγαλύτερη διάρκεια ωφελούνται περισσότερο από τις βελτιστοποιήσεις του. Όσο περισσότερο εκτελείται το πρόγραμμα, τόσο περισσότερες πληροφορίες τύπου χρόνου εκτέλεσης μπορεί να συγκεντρώσει το PyPy και τόσο περισσότερες βελτιστοποιήσεις μπορεί να κάνει. Ένα σενάριο Python δεν θα επωφεληθεί από κάτι τέτοιο. Οι εφαρμογές που επωφελούνται συνήθως έχουν βρόχους που εκτελούνται για μεγάλα χρονικά διαστήματα, ή εκτελούνται συνεχώς στο παρασκήνιο, για παράδειγμα, πλαίσια ιστού.

Το PyPy δεν πραγματοποιεί εκ των προτέρων συλλογή

PyPyσυλλέγει Κωδικός Python, αλλά δεν είναιέναν μεταγλωττιστή για τον κωδικό Python. Λόγω του τρόπου με τον οποίο το PyPy εκτελεί τις βελτιστοποιήσεις του και τον εγγενή δυναμισμό του Python, δεν υπάρχει τρόπος να εκπέμψετε τον κώδικα JITted που προκύπτει ως αυτόνομο δυαδικό και να τον επαναχρησιμοποιήσετε. Κάθε πρόγραμμα πρέπει να καταρτιστεί για κάθε εκτέλεση. Αν θέλετε να μεταγλωττίσετε το Python σε πιο γρήγορο κώδικα που μπορεί να εκτελεστεί ως αυτόνομη εφαρμογή, χρησιμοποιήστε το Cython, το Numba ή το τρέχον πειραματικό έργο Nuitka.