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

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

Πώς μπορεί να εφαρμοστεί το Parfor στο Python για παράλληλη επεξεργασία;

Η Python δεν διαθέτει ενσωματωμένο `parfor 'όπως το Matlab. Τα πλησιέστερα ισοδύναμα περιλαμβάνουν τη χρήση βιβλιοθηκών πολλαπλών επεξεργασιών για την επίτευξη παράλληλης συμπεριφοράς "για" βρόχου ". Η καλύτερη προσέγγιση εξαρτάται από τη φύση της εργασίας σας:

1. `multiprocessing.pool 'για εργασίες που συνδέονται με την CPU:

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

`` `Python

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

def my_function (i):

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

# Ο κωδικός σας εδώ ...

αποτέλεσμα =i * 2 # Παράδειγμα

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

Εάν __name__ =='__main__':

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

Αποτελέσματα =pool.map (my_function, εύρος (10)) # Range (10) είναι το εύρος βρόχου σας "για"

εκτύπωση (αποτελέσματα) # έξοδος:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

`` `

`multiprocessing.pool.map` εφαρμόζει` my_function` σε κάθε στοιχείο σε `εύρος (10)` παράλληλα. `multiprocessing.cpu_count ()` Καθορίζει τον βέλτιστο αριθμό διαδικασιών. Ρυθμίστε αυτό με βάση το σύστημά σας και τον αριθμό των διαθέσιμων πυρήνων. Θυμηθείτε το `αν __name__ =='__main __':` Το μπλοκ είναι ζωτικής σημασίας για την κατάλληλη πολλαπλασιασμό στα Windows.

2. `concurrent.futures.processpoolexecutor` (πιο ευέλικτο):

Αυτό προσφέρει περισσότερο έλεγχο και ευελιξία από το `multiprocessing.pool ', ειδικά αν χρειάζεστε πιο λεπτόκοκκο έλεγχο ή χειρισμό σφαλμάτων.

`` `Python

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

def my_function (i):

# Ο κωδικός σας εδώ ...

αποτέλεσμα =i * 2

επιστροφή i, αποτέλεσμα #returning τον αρχικό δείκτη και το αποτέλεσμα είναι χρήσιμο για την παρακολούθηση

Εάν __name__ =='__main__':

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

Αποτελέσματα =executor.map (my_function, εύρος (10))

για εγώ, αποτελέσματα σε αποτελέσματα:

Εκτύπωση (F "Είσοδος:{i}, έξοδος:{αποτέλεσμα}")

`` `

Το `executor.map` είναι παρόμοιο με το` pool.map`, αλλά επιτρέπει την εκτόξευση και χειρισμό εξαιρέσεων. Μπορείτε επίσης να χρησιμοποιήσετε το `executor.submit 'για περισσότερο ασύγχρονο έλεγχο.

3. `joblib` για απλούστερη σύνταξη (συχνά ταχύτερη):

`joblib` απλοποιεί παράλληλη επεξεργασία, ειδικά για numpy arrays. Συχνά εκτελεί καλύτερα από το `multiprocessing` για συγκεκριμένες αριθμητικές λειτουργίες.

`` `Python

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

def my_function (i):

# Ο κωδικός σας εδώ ...

αποτέλεσμα =i * 2

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

Εάν __name__ =='__main__':

Αποτελέσματα =παράλληλα (n_jobs =multiprocessing.cpu_count ()) (καθυστερημένη (my_function) (i) για i στην περιοχή (10))

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

`` `

`joblib` χειρίζεται αυτόματα τη διανομή εργασιών και τη συσσωμάτωση αποτελεσμάτων. `n_jobs` Καθορίζει τον αριθμό των παράλληλων διαδικασιών.

Σημαντικές εκτιμήσεις:

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

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

* εξαρτήσεις: Βεβαιωθείτε ότι οι λειτουργίες σας και οι εξαρτήσεις τους είναι σωστά συσκευασμένες και διαθέσιμες σε κάθε διαδικασία εργαζομένων.

* Εργασίες I/O-Bound: Εάν ο βρόχος σας περιλαμβάνει σημαντικές λειτουργίες εισόδου/εξόδου (π.χ. αιτήματα δικτύου, αναγνώσεις αρχείων), η χρήση `multiprocessing` ενδέχεται να μην παρέχει σημαντικές ταχύτητες. Εξετάστε το `asyncio` ή το` threading` αντ 'αυτού (αν και το `threading` περιορίζεται από το Global Interpreter Lock (GIL) στο CPYTHON).

Επιλέξτε την προσέγγιση που ταιριάζει καλύτερα στις ανάγκες σας και τα χαρακτηριστικά της εργασίας σας. Για απλές περιπτώσεις, το `joblib` παρέχει συχνά την ευκολότερη και πιο αποτελεσματική λύση. Για πιο περίπλοκα σενάρια με ασύγχρονες λειτουργίες ή λεπτόκοκκο έλεγχο, το `concurrent.futures 'είναι πιο ισχυρό. Θυμηθείτε να προφύσετε πάντα τον κωδικό σας για να καθορίσετε τα πραγματικά κέρδη απόδοσης.

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

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