Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

καλησπερα, εχω εναν αλγοριθμο σε mathematica, ο οποιος κανει χρηση αρκετων αναδρομικων συναρτησεων, με αποτελεσμα να τρεχει σε περιπου 3,30 δευτερολεπτα.

 

προσφατα ειπα να οργανωσω τον κωδικα μου, κι ετσι εισηγαγα style sheets, titles, sections, subsections κλπ.

 

Αυτο που βλεπω ειναι πως ο αλγοριθμος τρέχει είτε όλος μαζί (cntrl+a , evaluate) ή μετα πρέπει να τον τρέχω group-group καθε φορα, και με την προυποθεση το group να ειναι ανοιχτο (να φαινεται όλος ο κωδικας απο κατω κι όχι μονο ο τιτλος).

 

Όταν τον τρεξω ολοκληρο λοιπον, πεφτει σημαντικα η ταχυτητα του αλγοριθμου, καθως με το ιδιο input/output τρέχει σε 4,80 δευτερολεπτα περιπου. Εχει κανεις καμια ιδεα-λυση (εκτος του να καταργησω την λογικη αυτη της οργανωσης, με σωζει απο πολλες σκρολιες και βοηθα να εισαι πιο παραγωγικος);

 

ρωτησα και στο community της wolfram αλλα δεν πηρα καποια απαντηση.

Δημοσ.

καλησπερα, εχω εναν αλγοριθμο σε mathematica, ο οποιος κανει χρηση αρκετων αναδρομικων συναρτησεων, με αποτελεσμα να τρεχει σε περιπου 3,30 δευτερολεπτα.

 

προσφατα ειπα να οργανωσω τον κωδικα μου, κι ετσι εισηγαγα style sheets, titles, sections, subsections κλπ.

 

Αυτο που βλεπω ειναι πως ο αλγοριθμος τρέχει είτε όλος μαζί (cntrl+a , evaluate) ή μετα πρέπει να τον τρέχω group-group καθε φορα, και με την προυποθεση το group να ειναι ανοιχτο (να φαινεται όλος ο κωδικας απο κατω κι όχι μονο ο τιτλος).

 

Όταν τον τρεξω ολοκληρο λοιπον, πεφτει σημαντικα η ταχυτητα του αλγοριθμου, καθως με το ιδιο input/output τρέχει σε 4,80 δευτερολεπτα περιπου. Εχει κανεις καμια ιδεα-λυση (εκτος του να καταργησω την λογικη αυτη της οργανωσης, με σωζει απο πολλες σκρολιες και βοηθα να εισαι πιο παραγωγικος);

 

ρωτησα και στο community της wolfram αλλα δεν πηρα καποια απαντηση.

Καλησπέρα.

 

Μερικές γενικές παρατηρήσεις (φοβάμαι, εν είδει "αφορισμού").

 

1. Η Mathematica, πέρα από το (σε αρκετές περιπτώσεις) πολύ καλό "φινίρισμα", κάνει τέτοια καραγκιοζιλίκια (π.χ. διαχείρηση μνήμης, ειδικά η έκδοση για Windows, με αντίστοια kernel crashes -κατ' επέκταση).

 

2. Η αλήθεια είναι ότι η ομαδοποίηση (και τα άλλα που ανέφερες) βοηθούν πολύ:

    α) στην ανάγνωση του κώδικα από άλλους (ή από τον συγγραφέα, αν έχει παρέλθει καιρός)

    β) στην συντήρηση 

   Όμως, υπάρχει μια λεπτή γραμμή όσον αφορά τα δεδομένα από κελί σε κελί (λιγότερο) και από group σε group (περισσότερο).

 

Σε πρώτη φάση θα συνιστούσα να κάνεις το εξής "μαζοχιστικό" μεν, απαραίτητο (για εμένα) δε.

 

(Β0) Κλείσε τον πυρήνα (Quit[] ή αλλιώς). Ζητούμενο είναι να "καθαρίσει" η μνήμη.

(Β1) Παίρνεις τον αρχικό κώδικά σου -αυτόν δίχως την "μορφοποίηση".

(Β2) Τρέξε τον και μέτρησε όχι μόνο τον παρελθόντα χρόνο π.χ.

        InTime=AbsoluteTime[]

        Κώδικας

        OutTime=AbsoluteTime[]

        ElapsedTime=Round[(OutTime-InTime)/60]

        αλλά και την μνήμη (όπως προηγουμένως με MaxMemoryUsed[]) και σημείωσε τα αποτελέσματα.

(Β3) Προσπάθησε να τον χωρήσεις νοερώς σε κομμάτια (που αργότερα θα γίνουν τα groups που θες).

(Β4) Μορφοποιήσέ το πρώτο από τα κομμάτια αυτά και μέτρα μνήμη/χρόνο ως εξής (σχηματικώς):

        InTime=AbsoluteTime[]

        Πρώτο Κομμάτι που ΘΑ γίνει group 

        OutTime=AbsoluteTime[]

        ElapsedTime=Round[(OutTime-InTime)/60]

        (ομοίως και για μνήμη)

        InTime2=AbsoluteTime[]

        ΥΠΟΛΟΙΠΟΣ Κώδικας

        OutTime2=AbsoluteTime[]

        ElapsedTime2=Round[(OutTime2-InTime2)/60]

        (ομοίως και για μνήμη).

       

        Με αυτό το βήμα θα συγκρίνεις: απόδοση σε χρόνο/μνήμη ανάμεσα σε δύο εκδόσεις (τον "ακατέργαστο"    

        κώδικα και τον "ελαφρώς" μορφοποιημένο). 

        Αν δεις διαφορά υπέρ του "ακατέργαστου", σημαίνει ότι κάπου υπάρχει "data leaking" με την έννοια ότι δεν

        το έχεις χωρίσει καλώς και ότι αναγκάζεις το πρόγραμμα να ξαναϋπολογίσει ίδια πράγματα. Αν δεν δεις

        διαφορά ή αν δεις υπέρ του "ελαφρώς" τροποποιημένου τότε συνεχίζεις στο επόμενο Βήμα.

(Β5) Κάνεις ό,τι και στο (Β4) αλλά για το επόμενο κομμάτι (που θα γίνει το επόμενο group). Δηλαδή τώρα    

        συγκρίνεις τα αποτελέσματα του (Β4) με το: 

        InTime=AbsoluteTime[]

        Πρώτο Κομμάτι που ΘΑ γίνει group 

        OutTime=AbsoluteTime[]

        ElapsedTime=Round[(OutTime-InTime)/60]

        (ομοίως και για μνήμη)

        InTime2=AbsoluteTime[]

        Δεύτερο Κομμάτι που ΘΑ γίνει group 

        OutTime2=AbsoluteTime[]

        ElapsedTime2=Round[(OutTime2-InTime2)/60]

        (ομοίως και για μνήμη)

        InTime3=AbsoluteTime[]

        ΥΠΟΛΟΙΠΟΣ Κώδικας

        OutTime3=AbsoluteTime[]

        ElapsedTime23=Round[(OutTime3-InTime3)/60]

        (ομοίως και για μνήμη).

        Και συνεχίζεις την διερεύνηση για όλα τα κομμάτια... Λογικά, έτσι, θα δεις ποιό κομμάτι (δηλαδή πιό group)

        είναι υπεύθυνο για τις αποκλίσεις που ανέφερες.

 

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

 

Πιθανόν κάποιος ποιό ειδικός στο Mathematica, αν έβλεπε τον κώδικά σου, να σου έλεγε απ' ευθείας τί φταίει...

  • Like 2
Δημοσ.

πολυ ωραια, σε ευχαριστω. Οταν βρω χρονο θα κανω τα βηματα που περιγραφεις και θα ποσταρω εδω. 

Εν τω μεταξυ, μιλοντας με τον προγραμματιστη στη δουλεια μου εμαθα πως η βιβλιοθηκη για java της mathematica που χρησιμοποιουμε παιρνει τον αλγοριθμο σαν plain text, που σημαινει πως αν κανω την μορφοποιηση που συζηταμε, κι ακομα και αν οι χρονοι ηταν αποδεκτοι, το copy as plain text κουβαλαει μαζι "σαβουρα" οπως τα ονοματα των sections κλπ, τα οποια δεν ειμαι σιγουρος οτι μετα δεν θα κλωτσανε συντακτικα στο πως διαχειριζονται τον κωδικα.

 

επομενως, φοβαμαι πως ολο αυτο δεν εχει καμια χρησιμοτητα στην παρουσα.

 

παντως σε καθε περιπτωση ευχαριστω για την βοηθεια.

Δημοσ.

πολυ ωραια, σε ευχαριστω. Οταν βρω χρονο θα κανω τα βηματα που περιγραφεις και θα ποσταρω εδω. 

Εν τω μεταξυ, μιλοντας με τον προγραμματιστη στη δουλεια μου εμαθα πως η βιβλιοθηκη για java της mathematica που χρησιμοποιουμε παιρνει τον αλγοριθμο σαν plain text, που σημαινει πως αν κανω την μορφοποιηση που συζηταμε, κι ακομα και αν οι χρονοι ηταν αποδεκτοι, το copy as plain text κουβαλαει μαζι "σαβουρα" οπως τα ονοματα των sections κλπ, τα οποια δεν ειμαι σιγουρος οτι μετα δεν θα κλωτσανε συντακτικα στο πως διαχειριζονται τον κωδικα.

 

επομενως, φοβαμαι πως ολο αυτο δεν εχει καμια χρησιμοτητα στην παρουσα.

 

παντως σε καθε περιπτωση ευχαριστω για την βοηθεια.

Παρακαλώ -να' σαι καλά.

 

Η αλήθεια είναι ότι δεν ξέρω για αυτό περί Java. H δική μου χρήση, μέχρι τώρα, δεν αφορούσε κανενός είδους "binding". Eν τούτοις, στηριζόμενος στην "κακή φήμη" του Mathematica, αυτό είναι κάτι που θα το πίστευα ως "λογικό".

 

Σε αυτήν την περίπτωση, φοβάμαι, η μόνη λύση που έχεις είναι το forum της Wolfram -εκτός αν έχεις αγορασμένη άδεια χρήσεως και τεχνική υποστήριξη από την εταιρία.

 

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

Δημοσ.

προς το παρον αυτο θα κανω, καθως η μορφοποιηση αφορουσε μονο στο δικο μου productivity, κι οχι στην τελικη υλοποιηση. παντως θα εφαρμοσω τις συμβουλες σου, μηπως γενικα βελτιωσω το δικο μου κομματι.

 

thanx

Δημοσ.

επανερχομαι. εκανα οπως μου ειπες, χωρισα τον κωδικα ολο σε κομματια και μετρησα ταχυτητες.

το προβλημα βρισκετε οταν κανω αθροισματα σε ορους που προκυπτουν απο αναδρομικες συναρτησεις.

Στον ορισμο τον συναρτησεων εχει χρησιμοποιησει memoization

f[x_]:=f[x]= mpla mpla

το προβλημα λοιπον ειναι σε εκφρασεις οπως η ακολουθη:

marg = -Sum[j*f[0, j], {j, -100, 100}];

οπου f είναι η αναδρομικη μου συναρτηση. Αυτο το αθροισμα κανει απο 0.22-0.85 δευτερολεπτα να τρεξει, αναλογα με την περιπτωση.

δοκιμαζα μηπως εκανα αναθεση ολες τις τιμες της συναρτησης σε ενα πινακα, και μετα αθροιζα τα στοιχεια με μια Total, ομως και παλι η ταχυτητα ειναι απογοηευτικη.

 

pinakas = Table[i*f[0, i], {i, 0, 100}]
Total[pinakas]

τέλος προσπάθησα με For, αλλα πάλι οι ταχύτητες είναι ίδιες

s2=0
For[
i=0,i<=100,i++,
s2=s2+f[0,ι]
]

εχει κανεις καμια ιδεα, πως μπορω να επιταχυνω; σε σειριακο αλγοριθμο, πχ σε ενα excel ολα ειναι instant.

επίσης ο υπολογισμος των τιμών της συνάρτησης μου δεν αργεί, κάνω ένα 

print τις τιμές και υπολογίζονται πολύ γρήγορα. στο άθροισμα τα χαλάει.

 

σκέφτημα στον ορισμό της f να κόψω καποια δεκαδικά για να έχω μικρότερη ακρίβεια κι έτσι ταχύτερους υπολογισμούς, αλλα δεν το πολυκατέχω και δεν είδα καμια διαφορα.

Δημοσ.

 

επανερχομαι. εκανα οπως μου ειπες, χωρισα τον κωδικα ολο σε κομματια και μετρησα ταχυτητες.

το προβλημα βρισκετε οταν κανω αθροισματα σε ορους που προκυπτουν απο αναδρομικες συναρτησεις.

Στον ορισμο τον συναρτησεων εχει χρησιμοποιησει memoization

f[x_]:=f[x]= mpla mpla

το προβλημα λοιπον ειναι σε εκφρασεις οπως η ακολουθη:

marg = -Sum[j*f[0, j], {j, -100, 100}];

οπου f είναι η αναδρομικη μου συναρτηση. Αυτο το αθροισμα κανει απο 0.22-0.85 δευτερολεπτα να τρεξει, αναλογα με την περιπτωση.

δοκιμαζα μηπως εκανα αναθεση ολες τις τιμες της συναρτησης σε ενα πινακα, και μετα αθροιζα τα στοιχεια με μια Total, ομως και παλι η ταχυτητα ειναι απογοηευτικη.

 

pinakas = Table[i*f[0, i], {i, 0, 100}]
Total[pinakas]

τέλος προσπάθησα με For, αλλα πάλι οι ταχύτητες είναι ίδιες

s2=0
For[
i=0,i<=100,i++,
s2=s2+f[0,ι]
]

εχει κανεις καμια ιδεα, πως μπορω να επιταχυνω; σε σειριακο αλγοριθμο, πχ σε ενα excel ολα ειναι instant.

επίσης ο υπολογισμος των τιμών της συνάρτησης μου δεν αργεί, κάνω ένα 

print τις τιμές και υπολογίζονται πολύ γρήγορα. στο άθροισμα τα χαλάει.

 

σκέφτημα στον ορισμό της f να κόψω καποια δεκαδικά για να έχω μικρότερη ακρίβεια κι έτσι ταχύτερους υπολογισμούς, αλλα δεν το πολυκατέχω και δεν είδα καμια διαφορα.

 

Αν και έχω "σκουριάσει" αρκετά, με πάσα επιφύλαξη θα σου πω το εξής.

 

Στο σκαρίφημα του κώδικα που παρέχεις χρησιμοποιείς δύο πράγματα:

α) αποθήκευση στην μνήμη όλων των τιμών της συνάρτησης (το λες και εσύ άλλωστε) -αν και μάλλον για ακολουθίες πρόκειται (για να είμαστε μαθηματικώς ακριβείς)

β) άθροισμα εκφράσεων που, εν ολίγοις, περιέχουν τις αποθηκευμένες τιμές

Φοβάμαι ότι, με την μορφή που δίνεις,  βάζεις το πρόγραμμα να κάνει κάτι δύο φορές, οπότε εξ ου και ο αυξημένος χρόνος. Μην ξεχνάς ότι μια αναδρομική σχέση -εξ ορισμού- "οφείλει να θυμάται" τα προηγούμενα αποτελέσματα και "δουλεύει" είτε βάλεις την "απομνημόνευση" είτε όχι -μόνο που στην πρώτη περίπτωση είναι "άδικος κόπος".

 

Θα έλεγα να δοκιμάσεις να αποφύγεις την απομνημόνευση (ήτοι το α) ) και -χρησιμοποιώντας μόνο τον ορισμό της ακολουθίας- να πας κατ' ευθείαν στις αθροίσεις. Άλλωστε και το Excel που αναφέρεις, κάτι παρεμφερές κατ' αναλογία- κάνει (δεν "απομνημονεύει" -αν και οι τιμές είναι ήδη καταχωρημένες στα κελιά εκεί).

 

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

Δημοσ.

ευχαριαστω για την απαντηση, ναι εννοουσα συναρτηση στο mathematica. αν δεν την ορισω ετσι τοτε ειναι που κανει παραπανω υπολογισμους και σε καθε βημα υπολογιζει απο την αρχη ολα τα προηγουμενα.

το προβλημα ειναι στην αθροιση, εκει κατι μου διαφευγει μαλλον, αλλα σε καθε περιπτωση η συναρτηση μου υπολογιζει μια φορα το καθε βημα (νομιζω).

Δημοσ.

ευχαριαστω για την απαντηση, ναι εννοουσα συναρτηση στο mathematica. αν δεν την ορισω ετσι τοτε ειναι που κανει παραπανω υπολογισμους και σε καθε βημα υπολογιζει απο την αρχη ολα τα προηγουμενα.

το προβλημα ειναι στην αθροιση, εκει κατι μου διαφευγει μαλλον, αλλα σε καθε περιπτωση η συναρτηση μου υπολογιζει μια φορα το καθε βημα (νομιζω).

Ομοίως, με την σειρά μου, θα πω ότι στις αθροίσεις που παραθέτεις δεν βλέπω κάποιο πρόβλημα -εκτός αν υπάρχει κάτι στον ενδιάμεσο κώδικα (δηλαδή μεταξύ ακουλουθιών και αθροισμάτων).

  • Like 1
Δημοσ.

Ομοίως, με την σειρά μου, θα πω ότι στις αθροίσεις που παραθέτεις δεν βλέπω κάποιο πρόβλημα -εκτός αν υπάρχει κάτι στον ενδιάμεσο κώδικα (δηλαδή μεταξύ ακουλουθιών και αθροισμάτων).

Όντως, δεν βλέπω πρόβλημα στις αθροίσεις που παρέθεσες.

 

Α!, στον αλγόριθμό με την for, έχεις ένα ι ελληνικό -αντί i (αν και μάλλον σου ξέφυγε εδώ και όχι στον πρωτότυπο κώδικα).

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...