2014-02-23 60 views
1

我有一個模擬運行具有這樣的基本結構:Python腳本進展緩慢?

from time import time 

def CSV(*args): 
    #write * args to .CSV file 
    return 

def timeleft(a,L,period): 
    print(#details on how long last period took, ETA#) 

for L in range(0,6,4): 
    for a in range(1,100): 
     timeA = time() 

      for t in range(1,1000): 

       ## Manufacturer in Supply Chain ## 

       inventory_accounting_lists.append(#simple calculations#) 

        # Simulation to determine the optimal B-value (Basestock level) 

        for B in range(1,100): 
         for tau in range(1,1000): 
           ## simple inventory accounting operations## 

       ## Distributor in Supply Chain ## 

       inventory_accounting_lists.append(#simple calculations#) 

        # Simulation to determine the optimal B-value (Basestock level) 

        for B in range(1,100): 
         for tau in range(1,1000): 
           ## simple inventory accounting operations## 

       ## Wholesaler in Supply Chain ## 

       inventory_accounting_lists.append(#simple calculations#) 

        # Simulation to determine the optimal B-value (Basestock level) 

        for B in range(1,100): 
         for tau in range(1,1000): 
           ## simple inventory accounting operations## 

       ## Retailer in Supply Chain ## 

       inventory_accounting_lists.append(#simple calculations#) 

        # Simulation to determine the optimal B-value (Basestock level) 

        for B in range(1,100): 
         for tau in range(1,1000): 
           ## simple inventory accounting operations## 


     CSV(Simulation_Results) 

     timeB = time() 

     timeleft(a,L,timeB-timeA) 

隨着腳本繼續,它似乎是越來越慢。這就是這些值(它隨着增加而線性增加)。

  • L = 0a = 1:1.15分鐘
  • L = 0a = 99:1.7分鐘
  • L = 2a = 1:2.7分鐘
  • L = 2a = 99:5.15分鐘
  • L = 4a = 1:4.5分鐘
  • L = 4,a = 15:4.95分鐘(這是它已達到的最新值)

爲什麼每次迭代需要更長的時間?循環的每次迭代基本上重置除了每次添加的主全局列表之外的所有內容。但是,每個「句點」內的循環都不訪問此主列表 - 他們每次訪問同一本地列表。編輯1:我會在這裏發佈模擬代碼,以防萬一任何人想要通過它,但我警告你,這是相當長的,變量名可能不必要地混淆。

######### 
a = 0.01 
L = 0 
total = 1000 
sim = 500 
inv_cost = 1 
bl_cost = 4 
######### 

# Functions 

import random 
from time import time 
time0 = time() 

# function to report ETA etc. 

def timeleft(a,L,period_time): 
    if L==0: 
     periods_left = ((1-a)*100)-1+2*99 
    if L==2: 
     periods_left = ((1-a)*100)-1+99 
    if L==4: 
     periods_left = ((1-a)*100)-1+0*99 

    minute_time = period_time/60 

    minutes_left = (periods_left*period_time)/60 
    hours_left = (periods_left*period_time)/3600 
    percentage_complete = 100*((297-periods_left)/297) 

    print("Time for last period = ","%.2f" % minute_time," minutes") 

    print("%.2f" % percentage_complete,"% complete") 
    if hours_left<1: 
     print("%.2f" % minutes_left," minutes left") 
    else: 
     print("%.2f" % hours_left," hours left") 
    print("") 
    return 

def dcopy(inList): 
    if isinstance(inList, list): 
     return list(map(dcopy, inList)) 
    return inList 

# Save values to .CSV file 

def CSV(a,L,I_STD_1,I_STD_2,I_STD_3,I_STD_4,O_STD_0, 
     O_STD_1,O_STD_2,O_STD_3,O_STD_4): 

    pass 

# Initialization 

# These are the global, master lists of data 

I_STD_1 = [[0],[0],[0]] 
I_STD_2 = [[0],[0],[0]] 
I_STD_3 = [[0],[0],[0]] 
I_STD_4 = [[0],[0],[0]] 

O_STD_0 = [[0],[0],[0]] 
O_STD_1 = [[0],[0],[0]] 
O_STD_2 = [[0],[0],[0]] 
O_STD_3 = [[0],[0],[0]] 
O_STD_4 = [[0],[0],[0]] 

for L in range(0,6,2): 

    # These are local lists that are appended to at the end of every period 

    I_STD_1_L = [] 
    I_STD_2_L = [] 
    I_STD_3_L = [] 
    I_STD_4_L = [] 

    O_STD_0_L = [] 
    O_STD_1_L = [] 
    O_STD_2_L = [] 
    O_STD_3_L = [] 
    O_STD_4_L = [] 

    test = [] 

    for n in range(1,100):   # THIS is the start of the 99 value loop 

     a = n/100 

     print ("L=",L,", alpha=",a) 

     # Initialization for each Period 

     F_1 = [0,10]   # Forecast 
     F_2 = [0,10] 
     F_3 = [0,10] 
     F_4 = [0,10] 

     R_0 = [10]    # Items Received 
     R_1 = [10] 
     R_2 = [10] 
     R_3 = [10] 
     R_4 = [10] 

     for i in range(L): 
      R_1.append(10) 
      R_2.append(10) 
      R_3.append(10) 
      R_4.append(10) 

     I_1 = [10]    # Final Inventory 
     I_2 = [10] 
     I_3 = [10] 
     I_4 = [10] 

     IP_1 = [10+10*L]  # Inventory Position 
     IP_2 = [10+10*L] 
     IP_3 = [10+10*L] 
     IP_4 = [10+10*L] 

     O_1 = [10]    # Items Ordered 
     O_2 = [10] 
     O_3 = [10] 
     O_4 = [10] 

     BL_1 = [0]    # Backlog 
     BL_2 = [0] 
     BL_3 = [0] 
     BL_4 = [0] 

     OH_1 = [20]    # Items on Hand 
     OH_2 = [20] 
     OH_3 = [20] 
     OH_4 = [20] 

     OR_1 = [10]    # Order received from customer 
     OR_2 = [10] 
     OR_3 = [10] 
     OR_4 = [10] 

     Db_1 = [10]    # Running Average Demand 
     Db_2 = [10] 
     Db_3 = [10] 
     Db_4 = [10] 

     var_1 = [0]    # Running Variance in Demand 
     var_2 = [0] 
     var_3 = [0] 
     var_4 = [0] 

     B_1 = [IP_1[0]+10]  # Optimal Basestock 
     B_2 = [IP_2[0]+10] 
     B_3 = [IP_3[0]+10] 
     B_4 = [IP_4[0]+10] 

     D = [0,10]    # End constomer demand 

     for i in range(total+1): 
      D.append(9) 
      D.append(12) 
      D.append(8) 
      D.append(11) 

     period = [0] 

     from time import time 
     timeA = time() 

     # 1000 time periods t 

     for t in range(1,total+1): 

      period.append(t) 


      #### MANUFACTURER #### 

      # Manufacturing order from previous time period put into production 
      R_4.append(O_4[t-1]) 

      #recieve shipment from supplier, calculate items OH HAND 
      if I_4[t-1]<0: 
       OH_4.append(R_4[t]) 
      else: 
       OH_4.append(I_4[t-1]+R_4[t]) 

      # Recieve and dispatch order, update Inventory and Backlog for time t 

      if (O_3[t-1] + BL_4[t-1]) <= OH_4[t]:    # No Backlog 
       I_4.append(OH_4[t] - (O_3[t-1] + BL_4[t-1])) 
       BL_4.append(0) 
       R_3.append(O_3[t-1]+BL_4[t-1]) 
      else: 
       I_4.append(OH_4[t] - (O_3[t-1] + BL_4[t-1])) # Backlogged 
       BL_4.append(-I_4[t]) 
       R_3.append(OH_4[t]) 

      # Update Inventory Position 
      IP_4.append(IP_4[t-1] + O_4[t-1] - O_3[t-1]) 

      # Use exponential smoothing to forecast future demand 
      future_demand = (1-a)*F_4[t] + a*O_3[t-1] 
      F_4.append(future_demand) 

      # Calculate D_bar(t) and Var(t) 
      Db_4.append((1/t)*sum(O_3[0:t])) 
      s = 0 
      for i in range(0,t): 
       s+=(O_3[i]-Db_4[t])**2 

      if t==1: 
       var_4.append(0)         # var(1) = 0 
      else: 
       var_4.append((1/(t-1))*s) 

      # Simulation to determine B(t) 
      S_BC_4 = [10000000000]*10 
      Run_4 = [0]*10 
      for B in range(10,500): 

       S_OH_4 = OH_4[:] 
       S_I_4 = I_4[:] 
       S_R_4 = R_4[:] 
       S_BL_4 = BL_4[:] 
       S_IP_4 = IP_4[:] 
       S_O_4 = O_4[:] 

       # Update O(t)(the period just before the simulation begins) 
       # using the B value for the simulation 
       if B - S_IP_4[t] > 0:    
        S_O_4.append(B - S_IP_4[t]) 
       else: 
        S_O_4.append(0) 

       c = 0 

       for i in range(t+1,t+sim+1): 

        S_R_4.append(S_O_4[i-1]) 

        #simulate demand 
        demand = -1 
        while demand <0: 
         demand = random.normalvariate(F_4[t+1],(var_4[t])**(.5)) 

        # Receive simulated shipment, calculate simulated items on hand 

        if S_I_4[i-1]<0: 
         S_OH_4.append(S_R_4[i]) 
        else: 
         S_OH_4.append(S_I_4[i-1]+S_R_4[i]) 

        # Receive and send order, update Inventory and Backlog (simulated) 

        owed = (demand + S_BL_4[i-1]) 
        S_I_4.append(S_OH_4[i] - owed) 
        if owed <= S_OH_4[i]:        # No Backlog 
         S_BL_4.append(0) 
         c += inv_cost*S_I_4[i] 
        else: 
         S_BL_4.append(-S_I_4[i])      # Backlogged 
         c += bl_cost*S_BL_4[i] 

        # Update Inventory Position 
        S_IP_4.append(S_IP_4[i-1] + S_O_4[i-1] - demand) 

        # Update Order, Upstream member dispatches goods 
        if (B-S_IP_4[i]) > 0: 
         S_O_4.append(B - S_IP_4[i]) 
        else: 
         S_O_4.append(0) 

       # Log Simulation costs for that B-value 
       S_BC_4.append(c) 

       # If the simulated costs are increasing, stop 
       if B>11: 
        dummy = [] 

        for i in range(0,10): 
         dummy.append(S_BC_4[B-i]-S_BC_4[B-i-1]) 
        Run_4.append(sum(dummy)/float(len(dummy))) 

        if Run_4[B-3] > 0 and B>20: 
         break 
       else: 
        Run_4.append(0) 

      # Use minimum cost as new B(t) 
      var = min((val, idx) for (idx, val) in enumerate(S_BC_4)) 
      optimal_B = var[1] 
      B_4.append(optimal_B) 

      # Calculate O(t) 
      if B_4[t] - IP_4[t] > 0: 
       O_4.append(B_4[t] - IP_4[t]) 
      else: 
       O_4.append(0) 




      #### DISTRIBUTOR #### 

      #recieve shipment from supplier, calculate items OH HAND 
      if I_3[t-1]<0: 
       OH_3.append(R_3[t]) 
      else: 
       OH_3.append(I_3[t-1]+R_3[t]) 

      # Recieve and dispatch order, update Inventory and Backlog for time t 

      if (O_2[t-1] + BL_3[t-1]) <= OH_3[t]:    # No Backlog 
       I_3.append(OH_3[t] - (O_2[t-1] + BL_3[t-1])) 
       BL_3.append(0) 
       R_2.append(O_2[t-1]+BL_3[t-1]) 
      else: 
       I_3.append(OH_3[t] - (O_2[t-1] + BL_3[t-1])) # Backlogged 
       BL_3.append(-I_3[t]) 
       R_2.append(OH_3[t]) 

      # Update Inventory Position 
      IP_3.append(IP_3[t-1] + O_3[t-1] - O_2[t-1]) 

      # Use exponential smoothing to forecast future demand 
      future_demand = (1-a)*F_3[t] + a*O_2[t-1] 
      F_3.append(future_demand) 

      # Calculate D_bar(t) and Var(t) 
      Db_3.append((1/t)*sum(O_2[0:t])) 
      s = 0 
      for i in range(0,t): 
       s+=(O_2[i]-Db_3[t])**2 

      if t==1: 
       var_3.append(0)         # var(1) = 0 
      else: 
       var_3.append((1/(t-1))*s) 

      # Simulation to determine B(t) 
      S_BC_3 = [10000000000]*10 
      Run_3 = [0]*10 

      for B in range(10,500): 
       S_OH_3 = OH_3[:] 
       S_I_3 = I_3[:] 
       S_R_3 = R_3[:] 
       S_BL_3 = BL_3[:] 
       S_IP_3 = IP_3[:] 
       S_O_3 = O_3[:] 

       # Update O(t)(the period just before the simulation begins) 
       # using the B value for the simulation 
       if B - S_IP_3[t] > 0:    
        S_O_3.append(B - S_IP_3[t]) 
       else: 
        S_O_3.append(0) 
       c = 0 
       for i in range(t+1,t+sim+1): 

        #simulate demand 
        demand = -1 
        while demand <0: 
         demand = random.normalvariate(F_3[t+1],(var_3[t])**(.5)) 

        S_R_3.append(S_O_3[i-1]) 

        # Receive simulated shipment, calculate simulated items on hand 
        if S_I_3[i-1]<0: 
         S_OH_3.append(S_R_3[i]) 
        else: 
         S_OH_3.append(S_I_3[i-1]+S_R_3[i]) 

        # Receive and send order, update Inventory and Backlog (simulated) 
        owed = (demand + S_BL_3[i-1]) 
        S_I_3.append(S_OH_3[i] - owed) 
        if owed <= S_OH_3[i]:        # No Backlog 
         S_BL_3.append(0) 
         c += inv_cost*S_I_3[i] 
        else: 
         S_BL_3.append(-S_I_3[i])      # Backlogged 
         c += bl_cost*S_BL_3[i] 

        # Update Inventory Position 
        S_IP_3.append(S_IP_3[i-1] + S_O_3[i-1] - demand) 

        # Update Order, Upstream member dispatches goods 
        if (B-S_IP_3[i]) > 0: 
         S_O_3.append(B - S_IP_3[i]) 
        else: 
         S_O_3.append(0) 

       # Log Simulation costs for that B-value 
       S_BC_3.append(c) 

       # If the simulated costs are increasing, stop 
       if B>11: 
        dummy = [] 

        for i in range(0,10): 
         dummy.append(S_BC_3[B-i]-S_BC_3[B-i-1]) 
        Run_3.append(sum(dummy)/float(len(dummy))) 

        if Run_3[B-3] > 0 and B>20: 
         break 
       else: 
        Run_3.append(0) 

      # Use minimum cost as new B(t) 
      var = min((val, idx) for (idx, val) in enumerate(S_BC_3)) 
      optimal_B = var[1] 
      B_3.append(optimal_B) 

      # Calculate O(t) 
      if B_3[t] - IP_3[t] > 0: 
       O_3.append(B_3[t] - IP_3[t]) 
      else: 
       O_3.append(0) 



      #### WHOLESALER #### 

      #recieve shipment from supplier, calculate items OH HAND 
      if I_2[t-1]<0: 
       OH_2.append(R_2[t]) 
      else: 
       OH_2.append(I_2[t-1]+R_2[t]) 

      # Recieve and dispatch order, update Inventory and Backlog for time t 

      if (O_1[t-1] + BL_2[t-1]) <= OH_2[t]:    # No Backlog 
       I_2.append(OH_2[t] - (O_1[t-1] + BL_2[t-1])) 
       BL_2.append(0) 
       R_1.append(O_1[t-1]+BL_2[t-1]) 

      else: 
       I_2.append(OH_2[t] - (O_1[t-1] + BL_2[t-1])) # Backlogged 
       BL_2.append(-I_2[t]) 
       R_1.append(OH_2[t]) 

      # Update Inventory Position 
      IP_2.append(IP_2[t-1] + O_2[t-1] - O_1[t-1]) 

      # Use exponential smoothing to forecast future demand 
      future_demand = (1-a)*F_2[t] + a*O_1[t-1] 
      F_2.append(future_demand) 

      # Calculate D_bar(t) and Var(t) 
      Db_2.append((1/t)*sum(O_1[0:t])) 
      s = 0 
      for i in range(0,t): 
       s+=(O_1[i]-Db_2[t])**2 

      if t==1: 
       var_2.append(0)         # var(1) = 0 
      else: 
       var_2.append((1/(t-1))*s) 

      # Simulation to determine B(t) 
      S_BC_2 = [10000000000]*10 
      Run_2 = [0]*10 

      for B in range(10,500): 
       S_OH_2 = OH_2[:] 
       S_I_2 = I_2[:] 
       S_R_2 = R_2[:] 
       S_BL_2 = BL_2[:] 
       S_IP_2 = IP_2[:] 
       S_O_2 = O_2[:] 

       # Update O(t)(the period just before the simulation begins) 
       # using the B value for the simulation 
       if B - S_IP_2[t] > 0:    
        S_O_2.append(B - S_IP_2[t]) 
       else: 
        S_O_2.append(0) 
       c = 0 

       for i in range(t+1,t+sim+1): 

        #simulate demand 
        demand = -1 
        while demand <0: 
         demand = random.normalvariate(F_2[t+1],(var_2[t])**(.5)) 

        # Receive simulated shipment, calculate simulated items on hand 
        S_R_2.append(S_O_2[i-1]) 

        if S_I_2[i-1]<0: 
         S_OH_2.append(S_R_2[i]) 
        else: 
         S_OH_2.append(S_I_2[i-1]+S_R_2[i]) 

        # Receive and send order, update Inventory and Backlog (simulated) 

        owed = (demand + S_BL_2[i-1]) 
        S_I_2.append(S_OH_2[i] - owed) 
        if owed <= S_OH_2[i]:        # No Backlog 
         S_BL_2.append(0) 
         c += inv_cost*S_I_2[i] 
        else: 
         S_BL_2.append(-S_I_2[i])      # Backlogged 
         c += bl_cost*S_BL_2[i] 

        # Update Inventory Position 
        S_IP_2.append(S_IP_2[i-1] + S_O_2[i-1] - demand) 

        # Update Order, Upstream member dispatches goods 
        if (B-S_IP_2[i]) > 0: 
         S_O_2.append(B - S_IP_2[i]) 
        else: 
         S_O_2.append(0) 

       # Log Simulation costs for that B-value 
       S_BC_2.append(c) 

       # If the simulated costs are increasing, stop 
       if B>11: 
        dummy = [] 
        for i in range(0,10): 
         dummy.append(S_BC_2[B-i]-S_BC_2[B-i-1]) 
        Run_2.append(sum(dummy)/float(len(dummy))) 

        if Run_2[B-3] > 0 and B>20: 
         break 
       else: 
        Run_2.append(0) 

      # Use minimum cost as new B(t) 
      var = min((val, idx) for (idx, val) in enumerate(S_BC_2)) 
      optimal_B = var[1] 
      B_2.append(optimal_B) 

      # Calculate O(t) 
      if B_2[t] - IP_2[t] > 0: 
       O_2.append(B_2[t] - IP_2[t]) 
      else: 
       O_2.append(0) 





      #### RETAILER #### 

      #recieve shipment from supplier, calculate items OH HAND 
      if I_1[t-1]<0: 
       OH_1.append(R_1[t]) 
      else: 
       OH_1.append(I_1[t-1]+R_1[t]) 

      # Recieve and dispatch order, update Inventory and Backlog for time t 

      if (D[t] +BL_1[t-1]) <= OH_1[t]:    # No Backlog 
       I_1.append(OH_1[t] - (D[t] + BL_1[t-1])) 
       BL_1.append(0) 
       R_0.append(D[t]+BL_1[t-1]) 
      else: 
       I_1.append(OH_1[t] - (D[t] + BL_1[t-1])) # Backlogged 
       BL_1.append(-I_1[t]) 
       R_0.append(OH_1[t]) 

      # Update Inventory Position 
      IP_1.append(IP_1[t-1] + O_1[t-1] - D[t]) 

      # Use exponential smoothing to forecast future demand 
      future_demand = (1-a)*F_1[t] + a*D[t] 
      F_1.append(future_demand) 

      # Calculate D_bar(t) and Var(t) 
      Db_1.append((1/t)*sum(D[1:t+1])) 
      s = 0 
      for i in range(1,t+1): 
       s+=(D[i]-Db_1[t])**2 

      if t==1:           # Var(1) = 0 
       var_1.append(0) 
      else: 
       var_1.append((1/(t-1))*s) 

      # Simulation to determine B(t) 
      S_BC_1 = [10000000000]*10 
      Run_1 = [0]*10 
      for B in range(10,500): 
       S_OH_1 = OH_1[:] 
       S_I_1 = I_1[:] 
       S_R_1 = R_1[:] 
       S_BL_1 = BL_1[:] 
       S_IP_1 = IP_1[:] 
       S_O_1 = O_1[:] 

       # Update O(t)(the period just before the simulation begins) 
       # using the B value for the simulation 
       if B - S_IP_1[t] > 0:    
        S_O_1.append(B - S_IP_1[t]) 
       else: 
        S_O_1.append(0) 

       c=0 
       for i in range(t+1,t+sim+1): 

        #simulate demand 
        demand = -1 
        while demand <0: 
         demand = random.normalvariate(F_1[t+1],(var_1[t])**(.5)) 

        S_R_1.append(S_O_1[i-1]) 

        # Receive simulated shipment, calculate simulated items on hand 
        if S_I_1[i-1]<0: 
         S_OH_1.append(S_R_1[i]) 
        else: 
         S_OH_1.append(S_I_1[i-1]+S_R_1[i]) 

        # Receive and send order, update Inventory and Backlog (simulated) 
        owed = (demand + S_BL_1[i-1]) 
        S_I_1.append(S_OH_1[i] - owed) 
        if owed <= S_OH_1[i]:        # No Backlog 
         S_BL_1.append(0) 
         c += inv_cost*S_I_1[i] 
        else: 
         S_BL_1.append(-S_I_1[i])      # Backlogged 
         c += bl_cost*S_BL_1[i] 

        # Update Inventory Position 
        S_IP_1.append(S_IP_1[i-1] + S_O_1[i-1] - demand) 

        # Update Order, Upstream member dispatches goods 
        if (B-S_IP_1[i]) > 0: 
         S_O_1.append(B - S_IP_1[i]) 
        else: 
         S_O_1.append(0) 

       # Log Simulation costs for that B-value 
       S_BC_1.append(c) 

       # If the simulated costs are increasing, stop 
       if B>11: 
        dummy = [] 
        for i in range(0,10): 
         dummy.append(S_BC_1[B-i]-S_BC_1[B-i-1]) 
        Run_1.append(sum(dummy)/float(len(dummy))) 

        if Run_1[B-3] > 0 and B>20: 
         break 
       else: 
        Run_1.append(0) 

      # Use minimum as your new B(t) 
      var = min((val, idx) for (idx, val) in enumerate(S_BC_1)) 
      optimal_B = var[1] 
      B_1.append(optimal_B) 

      # Calculate O(t) 
      if B_1[t] - IP_1[t] > 0: 
       O_1.append(B_1[t] - IP_1[t]) 
      else: 
       O_1.append(0) 


     ### Calculate the Standard Devation of the last half of time periods ### 

     def STD(numbers): 
      k = len(numbers) 
      mean = sum(numbers)/k 
      SD = (sum([dev*dev for dev in [x-mean for x in numbers]])/(k-1))**.5 
      return SD 

     start = (total//2)+1 

     # Only use the last half of the time periods to calculate the standard deviation 

     I_STD_1_L.append(STD(I_1[start:])) 
     I_STD_2_L.append(STD(I_2[start:])) 
     I_STD_3_L.append(STD(I_3[start:])) 
     I_STD_4_L.append(STD(I_4[start:])) 

     O_STD_0_L.append(STD(D[start:])) 
     O_STD_1_L.append(STD(O_1[start:])) 
     O_STD_2_L.append(STD(O_2[start:])) 
     O_STD_3_L.append(STD(O_3[start:])) 
     O_STD_4_L.append(STD(O_4[start:])) 

     from time import time 
     timeB = time() 

     timeleft(a,L,timeB-timeA) 

     I_STD_1[L//2] = I_STD_1_L[:] 
     I_STD_2[L//2] = I_STD_2_L[:] 
     I_STD_3[L//2] = I_STD_3_L[:] 
     I_STD_4[L//2] = I_STD_4_L[:] 

     O_STD_0[L//2] = O_STD_0_L[:] 
     O_STD_1[L//2] = O_STD_1_L[:] 
     O_STD_2[L//2] = O_STD_2_L[:] 
     O_STD_3[L//2] = O_STD_3_L[:] 
     O_STD_4[L//2] = O_STD_4_L[:] 

     CSV(a,L,I_STD_1,I_STD_2,I_STD_3,I_STD_4,O_STD_0, 
      O_STD_1,O_STD_2,O_STD_3,O_STD_4) 


from time import time 
timeE = time() 

print("Run Time: ",(timeE-time0)/3600," hours") 
+1

如果沒有看到*複雜的模擬*就不可能說......如果全局列表非常龐大,並且您在'global_list中執行了某些操作':''''''''''''''''''''''''我只是猜測... –

+0

如果我發佈內部代碼會有幫助嗎?這很長。此外,全球名單並不是很大。每個模擬週期(總計297個模擬週期)僅將9個總浮點值添加到全局列表。最後,我想強調每個週期迭代是完全獨立的。一切都重置。 –

+0

你能用簡單的模擬來試試嗎?如果不會變慢,模擬本身就是延遲的根源。 –

回答

4

這將是一個看profiler的好時機。您可以剖析代碼以確定在哪裏花費時間。看起來問題可能出在模擬代碼中,但是不能看到代碼最好的幫助可能會變得模糊。

編輯中添加代碼光:

你做的名單,這雖然不是非常昂貴會消耗大量的時間複製了相當數量。

我同意你的代碼可能是不必要的混淆,並建議你清理代碼。將易混淆的名稱更改爲有意義的名稱可能會幫助您找到問題所在。

最後,可能出現這種情況,您的模擬計算過程很簡單。您可能需要考慮查看SciPy,Pandas或其他Python數學軟件包以獲得更好的性能,並可能需要更好的工具來表達您正在模擬的模型。

1

我遇到了類似的問題,我寫了一個Python 3.x腳本。該腳本隨機生成1,000,000(一百萬)個JSON對象,將它們寫出到一個文件中。

我的問題是隨着時間的推移,程序逐漸變慢。以下是每10,000個對象的時間戳記:

So far: Mar23-17:56:46:  0 
So far: Mar23-17:56:48: 10000 (2 seconds) 
So far: Mar23-17:56:50: 20000 (2 seconds) 
So far: Mar23-17:56:55: 30000 (5 seconds) 
So far: Mar23-17:57:01: 40000 (6 seconds) 
So far: Mar23-17:57:09: 50000 (8 seconds) 
So far: Mar23-17:57:18: 60000 (8 seconds) 
So far: Mar23-17:57:29: 70000 (11 seconds) 
So far: Mar23-17:57:42: 80000 (13 seconds) 
So far: Mar23-17:57:56: 90000 (14 seconds) 
So far: Mar23-17:58:13: 100000 (17 seconds) 
So far: Mar23-17:58:30: 110000 (17 seconds) 
So far: Mar23-17:58:51: 120000 (21 seconds) 
So far: Mar23-17:59:12: 130000 (21 seconds) 
So far: Mar23-17:59:35: 140000 (23 seconds) 

可以看出,該腳本逐漸延長以生成10,000條記錄組。

在我的情況下,原來是我產生唯一的ID號碼,每個在10250000000000-10350000000000的範圍內。爲了避免兩次再生相同的ID,我存儲新產生的ID在列表中,之後檢查該ID不存在於列表中存在:

trekIdList = [] 

def GenerateRandomTrek(): 
    global trekIdList 

    while True: 
     r = random.randint (10250000000000, 10350000000000) 
     if not r in trekIdList: 
      trekIdList.append (r) 
      return r 

的問題是,一個未排序的列表需要O(n)與搜索。由於新生成的ID附加到列表中,所以遍歷/搜索列表所需的時間會增加。

的解決方案是切換到字典(或地圖):

trekIdList = {} 
. . . 
def GenerateRandomTrek(): 
    global trekIdList 

    while True: 
     r = random.randint (10250000000000, 10350000000000) 
     if not r in trekIdList: 
      trekIdList [r] = 1 
      return r 

的改進是直接的:

So far: Mar23-18:11:30:  0 
So far: Mar23-18:11:30: 10000 
So far: Mar23-18:11:31: 20000 
So far: Mar23-18:11:31: 30000 
So far: Mar23-18:11:31: 40000 
So far: Mar23-18:11:32: 50000 
So far: Mar23-18:11:32: 60000 
So far: Mar23-18:11:32: 70000 
So far: Mar23-18:11:33: 80000 
So far: Mar23-18:11:33: 90000 
So far: Mar23-18:11:33: 100000 
So far: Mar23-18:11:34: 110000 
So far: Mar23-18:11:34: 120000 
So far: Mar23-18:11:34: 130000 
So far: Mar23-18:11:35: 140000 

的原因是,在字典/圖/散列訪問一個值是O(1)。

道德:當處理大量的項目時,使用字典/映射或二進制搜索比無序列表更有序的列表。