Как мы можем ускорить петли в мякоти - PullRequest
1 голос
/ 20 июня 2019

Моя проблема имеет 1500 ограничений и 1000 уравнений, и решение зависит от времени, добавление ограничений в мою модель с помощью цикла for занимает значительное количество времени.

В настоящее время я добавляю ограничения и уравнения к модели как

    for i in range(6000): 
        lputpay +=(x[i]*lput(pp[i],pst[i]))  #x[i] is pulp variable

Эта процедура занимает 60% времени процесса решения, я пробовал Numba, Cython, но не поддерживает объекты, не относящиеся к python.

1 Ответ

1 голос
/ 02 июля 2019

У меня была такая же проблема, и я не нашел способа исправить ее с помощью Python. Python - медленный язык, если вы не можете найти умный способ использовать библиотеки. Поскольку вы уже пробовали Numba и Cython, вы исчерпали большинство доступных вариантов в этой области.

Я решил свою проблему, переключив языки на использование JuMP Джулии . Джулия не всегда работала хорошо для меня (я обычно могу получить значительный прирост скорости, переключаясь на C ++), но оказалась идеальной для этой проблемы: представление было все еще на высоком уровне, но производительность была намного лучше чем Python.

Быстрый пример:

using JuMP
using Cbc
lpModel = Model(solver = CbcSolver(seconds = 3600))
@variable(lpModel, x >= 5)
@variable(lpModel, y >= 6)
@constraint(lpModel, x+y == 18)
@constraint(lpModel, 20x + 30y <= 470)
@objective(lpModel, Max, 2x + 3y)
status = JuMP.solve(lpModel)
println("Number of Tea Cups: $(getvalue(x))")
println("Number of Coffee Mugs : $(getvalue(y))")
...