Συζήτηση
Γεια χαρά, Επισκέπτης
Όνομα χρήστη: Κωδικός: Να με θυμάσαι

ΘΕΜΑ: Multiprocessing και Πολλαπλασιασμό Πινάκων

Multiprocessing και Πολλαπλασιασμό Πινάκων 2 Χρόνια 5 Μήνες πριν #3420

  • Lydia
  • Το Άβαταρ του/της Lydia
  • Αποσυνδεμένος
  • p_____
  • Δημοσιεύσεις: 1
Λοιπόν 'εχω συντάξει το εξής πρόγραμμα που δημιουργεί τυχαίους πίνακες διαστάσεων που επιλέγει ο χρήστης και εμφανίζει το γινομενό τους.
Αποφάσισα για να μην καθυστερεί το πρόγραμμα με πράξεις πινάκων μεγάλων διαστάσεων (π.χ. 1000x10000 κ.λ.π.) να ενσωματώσω εντολές της βιβλιοθήκης multiprocessing σε αυτό.Χρησιμοποίησα κυρίως τις εντολές pool και map.
Τα αποτελέσματα όμως δεν ήταν τα αναμενόμενα αφού με την multiprocessing καθυστερούσε περισσότερο!
# -*- coding: cp1253 -*-
#MHN BALETE PRAKSEIS POY DEN ORIZONTAI
#oi pinakes poy ftiaxnei auto to programma einai oysiastika listes poy kathe stoixeio toys
#einai mia grammh toy pinaka
#p.x. o  A=[[2,3,3,4],[5,7,6,8],[1,0,3,7]] eiani enas pinakas 3*4
from random import *
import time
def tp(grammes,sthles):#dhmiourgia tyxaioy pinaka,pairnw ws orismata tis diastaseis toy
    L=[]
    for i in range(grammes):
        L.append([])
    for i in range(grammes):
        for j in range(sthles):
            L[i].append(randint(0,5))
    return L#epistrefei enan tyxaio pinaka
def gin(A,L,gr1,st1,gr2,st2):#ginomeno pinakwn,orismata:oi pinakes kai oi diastaseis tous
#gr1,st1:oi grammes kai sthles toy A &  gr2,st2 oi grammes kai oi sthles toy B
    B=[]
    for i in range(st2):
        B.append([])
    for i in range(st2):
        for j in range(gr2):
            B[i].append(L[j][i])
    V=[]
    for i in range(gr1):
        V.append([])
    for k in range(gr1):
        for i in range(st2):
            s=0
            for j in range(st1):
                s=s+A[k][j]*B[i][j]
            V[k].append(s)
    return V
#ektypwsh kathe pinaka,yparxei eidikh synarthsh gia thn ektypwsh gia na mhn ektypwnontai oi #pinakes ws listes
#alla me thn synhthismenh morfh twn pinakwn
def ektypwsh(A,gr,st):
    for j in range(int(gr)):
        s=""
        for i in range(int(st)):
            s=s+str(A[j][i])+"  "
        print s#typwnei kathe grammh toy pinaka ksexwrista
gr1=input("Δώσε τις γραμμές του 1ου πίνακα:")
st1=input("Δώσε τις στήλες του 1ου πίνακα:")
gr2=input("Δώσε τις γραμμές του 2ου πίνακα:")
st2=input("Δώσε τις στήλες του 2ου πίνακα:")
start_time=time.clock()#ksekinaei na metraei to xrono apo thn stimh pou dothikan oi diastaseis
D=tp(gr1,st1)
N=tp(gr2,st2)
C=gin(D,N,gr1,st1,gr2,st2)
print "Ο 1ος πίνακας είναι ο εξής:"
ektypwsh(D,gr1,st1)
print "Ο 2ος πίνακας είναι ο εξής:"
ektypwsh(N,gr2,st2)
print "Το γινόμενο των 2 πινάκων είναι:"
ektypwsh(C,gr1,st2)
print time.clock()-start_time,"seconds"#emfanizei to xrono>>

μπορεί κάποιος να εξηγήσει πως πρέπει να είναι ο κώδικας για να τρέξει το παραπάνω πρόγραμμα με multiprocessing
Τελευταία διόρθωση: 2 Χρόνια 5 Μήνες πριν από Lydia.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Multiprocessing και Πολλαπλασιασμό Πινάκων 2 Χρόνια 5 Μήνες πριν #3421

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 674
  • Ληφθείσες Ευχαριστίες 109
1. Στην πράξη ο πολλαπλασιασμός πινάκων γίνεται χρησιμοποιώντας το numpy: www.numpy.org/

2. Δεν δίνεις τον κώδικα για multiprocessing οπότε δεν μπορούμε να ξέρουμε τι ακριβώς έκανες. Εν γένει πάντως αν το μέγεθος του προβλήματος είναι πολύ μικρό (πχ η δημιουργία ενός πίνακα 3x5) ενδέχεται το overhead της δημιουργίας νέων processes να είναι μεγαλύτερο από τα πιθανά κέρδη που μπορείς να έχεις.

3. Ο τρόπος που μετράς τον χρόνο δεν είναι σωστός. Πρέπει να τρέξεις πολλές φορές τον κώδικα και να κρατήσεις την πιο γρήγορη εκτέλεση. Η διαδικασία αυτή ονομάζεται profiling. Google «python + profiling» για να δεις πως πρέπει να το κάνεις.

4. Προσωπικά πριν πάω σε θέματα όπως το multiprocessing, τα οποία είναι πιο προχωρημένα, θα προσπαθούσα να μάθω λίγο περισσότερη python. Δες πχ πως μπορεί να ξαναγραφεί η πρώτη σου συνάρτηση:
def get_random_matrix(n_rows, n_cols, low=0, high=5):
    """ Return a `rows x cols` matrix with random integers ∈ in `[low, high]`. """
    matrix = []
    for row in range(n_rows):
        column = [randint(low, high) for i in range(n_cols)]
        matrix.append(column)
    return matrix
Ή, και ακόμα πιο σύντομα:
def get_random_matrix2(n_rows, n_cols, low=0, high=5):
    """ Return a `rows x cols` matrix with random integers ∈ in `[low, high]`. """
    matrix = [[randint(low, high) for i in range(n_cols)] for row in range(n_rows)]
    return matrix
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.

Multiprocessing και Πολλαπλασιασμό Πινάκων 2 Χρόνια 5 Μήνες πριν #3422

  • pmav99
  • Το Άβαταρ του/της pmav99
  • Αποσυνδεμένος
  • Author
  • Δημοσιεύσεις: 674
  • Ληφθείσες Ευχαριστίες 109
A! και ο πιο εύκολος τρόπος για να χρησιμοποιήσεις multiprocessing/multithreading σε python είναι η βιβλιοθήκη futures pythonhosted.org/futures/
Αν χρησιμοποιείς python 3 υπάρχει στην Standard Library. Στην python 2 θα πρέπει να την εγκαταστήσεις.
Πρέπει να είστε εγγεγραμμένο μέλος του Φόρουμ για να κάνετε μια δημοσίευση.
Οι ακόλουθοι χρήστες είπαν "Σε Ευχαριστώ": Allaz
Συντονιστές: pmav99
Χρόνος δημιουργίας σελίδας: 0.526 δευτερόλεπτα

Μοιράσου το!

Powered by CoalaWeb

Λίστα Ταχυδρομείου