В экспериментах на моей локальной машине я обнаружил, что tupledict.prod API Python gurobi не обеспечивает преимущества в эффективности по сравнению с циклами Python, что меня удивляет.Я сравниваю следующие два фрагмента кода и ожидаю, что фрагмент кода 1 будет намного быстрее, чем 2. Однако опытным путем я обнаружил, что они, по сути, имеют одинаковую скорость.Большую часть времени для обоих фрагментов составляет добавление переменных к цели (оба занимают ~ 100 с).Стоит ли ожидать, что фрагмент 1 будет более эффективным, чем фрагмент 2?Есть ли что-то, что я мог бы сделать более эффективно в любом фрагменте?
настройка:
self.n_rev = 1373
self.n_pap = 2623
self.weights = weights # numpy 2d array
self.loads = loads # numpy 1d array
self.coverages = coverages # numpy 1d array
фрагмент 1:
# Primal vars.
start = time.time()
self.lp_vars = self.m.addVars(self.n_rev, self.n_pap, vtype=GRB.BINARY, name='x')
self.m.update()
print('Time to add vars %s' % (time.time() - start))
# Objective.
start = time.time()
coeff = list(self.weights.flatten())
print('flatten %s' % (time.time() - start))
start = time.time()
coeff = dict(zip(self.lp_vars.keys(), coeff))
print('zip %s' % (time.time() - start))
start = time.time()
obj = self.lp_vars.prod(coeff)
print('prod %s' % (time.time() - start))
start = time.time()
self.m.setObjective(obj, GRB.MAXIMIZE)
print('Time to set objective %s' % (time.time() - start))
# Constraints.
start = time.time()
self.m.addConstrs((self.lp_vars.sum(r, '*') <= l
for r, l in enumerate(self.loads)))
self.m.addConstrs((self.lp_vars.sum('*', p) == c
for p, c in enumerate(self.coverages)))
self.m.update()
print('Time to add constraints %s' % (time.time() - start))
фрагмент 2:
# primal variables
start = time.time()
self.lp_vars = []
for i in range(self.n_rev):
self.lp_vars.append([])
for j in range(self.n_pap):
self.lp_vars[i].append(self.m.addVar(vtype=GRB.BINARY,
name=self.var_name(i, j)))
self.m.update()
# Set the objective.
start = time.time()
obj = LinExpr()
for i in range(self.n_rev):
for j in range(self.n_pap):
obj += self.weights[i][j] * self.lp_vars[i][j]
self.m.setObjective(obj, GRB.MAXIMIZE)
print('Objective %s' % (time.time() - start))
start = time.time()
# constraints.
for r, l in enumerate(self.loads):
self.m.addConstr(sum(self.lp_vars[r]) <= l, "r" + str(r))
for p, cov in enumerate(self.coverages):
self.m.addConstr(sum([self.lp_vars[i][p]
for i in range(self.n_rev)]) == cov,
"p" + str(p))
self.m.update()
print('Constraints %s' % (time.time() - start))