Voor een project ben ik bezig met Python. Helaas heb ik niet heel veel kennis hierin, waardoor ik bepaalde dingen op een inefficiënte manier doe. Met als gevolg dat mijn code veel te lang aan het draaien is, wat normaal gezien geen probleem is, maar wel als je een bepaalde functie heel vaak aan wil roepen...
Ik heb onderstaande functie gemaakt:
Deze code wordt per loop vervolgens zo'n 600 keer aangeroepen, wat +/- 2 sec duurt. Echter is deze loop ook weer onderdeel van een andere loop, waardoor de running time te hoog is om de code te kunnen gebruiken.
Googlen op internet levert mij al op dat nparrays niet bedoeld zijn om over te loopen. En dan helemaal niet als dat een gigantisch grote array is. Het weghalen van de binnenste loop (dmv vectorization) heeft mij al een mooie tijdswinst opgeleverd, maar ik zie niet hoe ik van de buitenste loop af kan komen (en al helemaal niet van de maandloop, maar ik denk dat hier minder tijdwinst in zit).
Ik zie geen oplossing aangezien 'demandarray' veranderd per waarde van n (deze array wordt namelijk kleiner als n[0] groter wordt). Heeft iemand hier toevallig een idee hoe ik dit op kan lossen?
Ik heb onderstaande functie gemaakt:
code:
1
2
3
4
5
6
7
8
9
10
11
| def CalculateNewFillRate(item, basestock): FR = [] for month in range(12): ltdarray = item.LTD[month-1][item.LTD[month][:,0] <= basestock] #only keep values where ltd is lower than basestock totalsum = 0 for n in ltdarray: demandarray = item.demand[month-1][item.demand[month][:,0] <= basestock - n[0]] #keep values where part of demand can be fulfilled sumofn = np.sum((demandarray[:,0] - basestock + n[0]) * demandarray[:,1]) # get the sum of n totalsum += (sumofn + basestock - n[0]) * n[1] #add this to totalsum FR.append(totalsum) return FR |
Deze code wordt per loop vervolgens zo'n 600 keer aangeroepen, wat +/- 2 sec duurt. Echter is deze loop ook weer onderdeel van een andere loop, waardoor de running time te hoog is om de code te kunnen gebruiken.
Googlen op internet levert mij al op dat nparrays niet bedoeld zijn om over te loopen. En dan helemaal niet als dat een gigantisch grote array is. Het weghalen van de binnenste loop (dmv vectorization) heeft mij al een mooie tijdswinst opgeleverd, maar ik zie niet hoe ik van de buitenste loop af kan komen (en al helemaal niet van de maandloop, maar ik denk dat hier minder tijdwinst in zit).
Ik zie geen oplossing aangezien 'demandarray' veranderd per waarde van n (deze array wordt namelijk kleiner als n[0] groter wordt). Heeft iemand hier toevallig een idee hoe ik dit op kan lossen?
[ Voor 6% gewijzigd door Daiov97 op 30-06-2021 18:26 ]