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

Γνώση Υπολογιστών >> Προγραμματισμός >  >> Python Προγραμματισμός

Πώς μπορώ να χρησιμοποιήσω αποτελεσματικά το τρέξιμο για βρόχο σε παράλληλη Python για να βελτιστοποιήσω την εκτέλεση του κώδικα μου;

Το ενσωματωμένο βρόχο του Python δεν είναι εγγενώς παραλληλισμένος. Για να εκτελέσετε έναν παράλληλο βρόχο «για», πρέπει να χρησιμοποιήσετε βιβλιοθήκες σχεδιασμένες για παράλληλη επεξεργασία. Οι πιο συνηθισμένες προσεγγίσεις χρησιμοποιούν τις ενότητες `multiprocessing 'ή εξειδικευμένες βιβλιοθήκες όπως' ταυτόχρονα. Η καλύτερη επιλογή εξαρτάται από τη φύση των καθηκόντων σας.

Ακολουθεί μια κατανομή του τρόπου παραλληλισμού ενός "για" βρόχο "για αυτές τις μεθόδους, μαζί με τις εκτιμήσεις για τη βέλτιστη απόδοση:

1. `multiprocessing`:

Αυτή η ενότητα παρέχει τον πιο άμεσο έλεγχο σε παράλληλες διαδικασίες. Είναι το πιο κατάλληλο όταν οι επαναλήψεις βρόχου σας είναι υπολογιστικά εντατικές και ανεξάρτητες (χωρίς εξαρτήσεις κοινής μνήμης).

`` `Python

Εισαγωγή πολλαπλής επεξεργασίας

def process_item (στοιχείο):

"" "Η λειτουργία που πρέπει να εκτελεστεί παράλληλα για κάθε στοιχείο." ""

# Ο κωδικός σας για να επεξεργαστείτε ένα μόνο στοιχείο πηγαίνει εδώ. Παράδειγμα:

Αποτέλεσμα =Στοιχείο * 2

αποτέλεσμα επιστροφής

Εάν __name__ =='__main__':# κρίσιμη για τη συμβατότητα των Windows

δεδομένα =λίστα (εύρος (1000)) # Τα δεδομένα σας

με multiprocessing.pool (διαδικασίες =multiprocessing.cpu_count ()) ως πισίνα:

Αποτελέσματα =pool.map (process_item, δεδομένα) # Εφαρμογή process_item σε κάθε στοιχείο στα δεδομένα

εκτύπωση (αποτελέσματα)

`` `

* `multiprocessing.pool`: Δημιουργεί μια δεξαμενή διαδικασιών εργαζομένων. `multiprocessing.cpu_count ()` Καθορίζει τον βέλτιστο αριθμό διαδικασιών που βασίζονται στους πυρήνες CPU του συστήματός σας. Ρυθμίστε αυτόν τον αριθμό εάν χρειαστεί (π.χ. για υπερ -ανάγνωση).

* `pool.map`: Εφαρμόζει τη λειτουργία `process_item` σε κάθε στοιχείο στο` data 'iterable, διανέμοντας το έργο σε όλες τις διαδικασίες.

* αν __name__ =='__main __':`: Αυτό είναι απαραίτητο, ειδικά στα Windows, για να αποφευχθεί η αναδρομική δημιουργία διαδικασιών που μπορεί να οδηγήσει σε συντριβές.

2. `concurrent.futures`:

Αυτή η ενότητα παρέχει μια διεπαφή υψηλότερου επιπέδου από την `multiprocessing`, προσφέροντας παράλληλο παραλληλισμό με βάση τη διαδικασία και με βάση το νήμα. Τα νήματα είναι γενικά ελαφρύτερο βάρος, αλλά περιορίζονται από το Global Interpreter Lock (GIL) στο CPYTHON, καθιστώντας τα λιγότερο αποτελεσματικά για εργασίες που συνδέονται με την CPU.

`` `Python

Εισαγωγή ταυτόχρονα.

def process_item (στοιχείο):

# Ίδια όπως και πριν

Αποτέλεσμα =Στοιχείο * 2

αποτέλεσμα επιστροφής

Εάν __name__ =='__main__':

δεδομένα =λίστα (εύρος (1000))

με ταυτόχρονα.

Αποτελέσματα =Λίστα (executor.map (process_item, δεδομένα))

εκτύπωση (αποτελέσματα)

`` `

* `ProcessPoolexecutor`: Χρησιμοποιεί διαδικασίες, κατάλληλες για επιχειρήσεις με CPU.

* `threadpoolexecutor`: Χρησιμοποιεί νήματα, καλύτερα για λειτουργίες που συνδέονται με I/O (περιμένοντας αιτήματα δικτύου, αναγνώσεις αρχείων κ.λπ.).

3. `joblib`:

Το `joblib` είναι μια βιβλιοθήκη ειδικά σχεδιασμένη για παράλληλη πληροφορική στην Python. Χρησιμοποιείται συχνά στα πλαίσια της επιστήμης των δεδομένων και της μηχανικής μάθησης. Προσφέρει βολικά χαρακτηριστικά και χειρίζεται αυτόματα κάποιες πολυπλοκότητες.

`` `Python

Από την εισαγωγή JOBLIB παράλληλη, καθυστερημένη

def process_item (στοιχείο):

# Ίδια όπως και πριν

Αποτέλεσμα =Στοιχείο * 2

αποτέλεσμα επιστροφής

Εάν __name__ =='__main__':

δεδομένα =λίστα (εύρος (1000))

Αποτελέσματα =παράλληλα (n_jobs =-1) (καθυστερημένη (process_item) (στοιχείο) για στοιχείο σε δεδομένα) # n_jobs =-1 χρησιμοποιεί όλους τους επεξεργαστές

εκτύπωση (αποτελέσματα)

`` `

* παράλληλα (n_jobs =-1) `: Εκτελεί τις εργασίες παράλληλα χρησιμοποιώντας όλους τους διαθέσιμους πυρήνες CPU (`-1`).

* `Delayed (process_item) (στοιχείο)`: Καθυστερεί την εκτέλεση του `process_item` μέχρι να προγραμματιστεί από το« παράλληλο ».

Σκέψεις αποδοτικότητας:

* overhead: Η παραλληλισμός εισάγει γενικά έξοδα. Εάν οι μεμονωμένες εργασίες σας είναι πολύ γρήγορες, τα γενικά έξοδα μπορεί να αντισταθμίσουν τα οφέλη. Πειραματιστείτε για να βρείτε τη βέλτιστη ισορροπία.

* Μεταφορά δεδομένων: Η διέλευση δεδομένων μεταξύ των διαδικασιών μπορεί να είναι αργή. Ελαχιστοποιήστε το ποσό των δεδομένων που μεταφέρονται, εάν είναι δυνατόν.

* εξαρτήσεις: Εάν οι επαναλήψεις βρόχου εξαρτώνται μεταξύ τους (π.χ., η έξοδος μιας επανάληψης είναι η είσοδος για το επόμενο), η παραλληλισμός γίνεται πολύ πιο περίπλοκη και μπορεί να μην είναι εφικτή.

* Κοινόχρηστοι πόροι: Αποφύγετε την πρόσβαση σε κοινούς πόρους (αρχεία, βάσεις δεδομένων) από πολλαπλές διαδικασίες ταυτόχρονα χωρίς τους κατάλληλους μηχανισμούς συγχρονισμού (κλειδαριές, σηματοφόρα), καθώς αυτό μπορεί να οδηγήσει σε συνθήκες φυλής και διαφθορά δεδομένων.

* Αριθμός διαδικασιών: Ο βέλτιστος αριθμός διαδικασιών είναι συνήθως κοντά στον αριθμό των πυρήνων της CPU, αλλά μπορεί να ποικίλει ανάλογα με το φορτίο εργασίας και συστήματος. Ο πειραματισμός είναι το κλειδί.

Θυμηθείτε να προφύσετε τον κωδικό σας για να προσδιορίσετε τα σημεία συμφόρησης και να μετρήσετε τη βελτίωση της απόδοσης που επιτυγχάνεται μέσω της παραλληλισμού. Μόνο παραλληλίστε τμήματα του κώδικα που συμβάλλουν σημαντικά στο συνολικό χρόνο εκτέλεσης. Η ακατάλληλη παραλληλισμός μπορεί στην πραγματικότητα * να μειώσει * την απόδοση.

Συναφής σύστασή

Πνευματικά δικαιώματα © Γνώση Υπολογιστών Όλα τα δικαιώματα κατοχυρωμένα