2016-05-28 3 views
0

В настоящее время я работаю над программой для проверки идеальных значений угла для создания чего-либо. Теперь я застрял в вложенном для цикла, который я собираюсь приложить ниже. В то время как идеал он будет считать каждый «а» до 9000, он уже берет почти навсегда, если значения заданы так, как показано ниже. Есть ли способ ускорить этот вложенный цикл? Или я могу каким-то образом назначить больше ресурсов для python?Проблемы с контентом вложенных циклов Python

for a1 in xrange(15, 91): 
    for a2 in xrange(15, 91): 
     for a3 in xrange(15, 91): 
      for a4 in xrange(15, 91): 
       for a5 in xrange(15, 91): 
        for ite in xrange(1, 1000): 
         ok = mathmatvec(a1, a2, a3, a4, a5, ite) 
         if ok == 1: 
           v[0] = a1 
           v[1] = a2 
           . 
           . 
+2

Вы уверены, что вам нужно проверить все комбинации '76 * 76 * 76 * 76 * 76 * 999' =' 2532989850624' = ** 2,5 трлн **? Даже если операция выполнить не будет (замените last для тела оператора «pass»), она все равно будет «почти вечно». –

+1

что делает mathmatvec() делать? временная сложность для этой функции? –

+0

вычисляет множественные умножения векторов и матриц. Это не займет заметного времени, если просто использовать один раз сам по себе.для получения более подробной информации см. мой ответ Rory Daulton – Rugir

ответ

1

itertools.product() функция будет значительно ускорить вложенную для-петли.

При этом время работы, скорее всего, будет определяться общим числом звонков на mathmatvec().

0

Вы можете попробовать конвертировать for в циклы while, должен быть быстрее, поскольку последний не создает итераторов. Таким образом, вместо:

for a1 in xrange(15, 91): 

пишут:

a1 = 15 
while a1 < 91: 
    ... 
    a1 += 1 

Или попробуйте использовать PyPy.

0

Решение: Используйте другой алгоритм.

Как и сейчас, вы выполняете самую внутреннюю петлю 999 * (76 ** 5) == 2,532,989,850,624 раз. Это, вероятно, слишком много, если только самые внутренние вычисления петли тривиальны.

Вы говорите, что хотите «проверить идеальные значения угла, чтобы что-то построить». Если вы можете формализовать то, что означает «идеальный», вы можете использовать алгоритм оптимизации с нулевым потреблением. Если вы дадите нам более подробную информацию о том, что вы ищете, мы сможем рассказать вам о лучшей подпрограмме или алгоритме Python.


Если я вас правильно понял, mathmatvec() принимает только значения 0 и 1, и вы хотите, чтобы найти значения a1,a2,a3,a4 для 15 <= a1 <= 90 и т.д. и ite для 1 <= ite <= 999, которые делают mathmatvec(a1, a2, a3, a4, ite) равное 1, и где ite настолько мал, возможное.

Вы можете сделать эту многомерную задачу минимизации с помощью функции

def func(a1, a2, a3, a4, ite): 
    return ite - 1000 * mathmatvec(a1, a2, a3, a4, ite) 

Затем func() возвращает положительное число mathmatvec() == 0 и отрицательную для mathmatvec() == 1, а отрицательные значения сводятся к минимуму, когда ite сведено к минимуму.

В зависимости от того, как «гладкая» ваша функция mathmatvec(), как она связана, и ее фитнес-ландшафт, одна из процедур минимизации в scipy.optimize может решить вашу проблему достаточно хорошо. scipy.optimize.differential_evolution() function выглядит особенно интересным.

+0

, в то время как я не могу поместить формулу в mathmatvec в тривиальные термины, он проверяет, для каких 5 углов минимальное значение может быть достигнуто (значение ite равно 0,0001 в формуле), поэтому я предполагал проверить каждую возможную комбинацию углов (диапазон от 15 до 90 градусов), если можно найти минимальное значение (результат функции) для ite. – Rugir

+0

Я не понимаю, что вы имеете в виду о «ите». Но вы ищете значения переменных a1, a2, a3, a4, a5, ite, которые дают вам наименьший «действительный» результат функции mathmatvec()? Если да, то какие значения возвращаются и с каким диапазоном? Что такое «неверный» результат функции? Теперь это звучит так, будто вы хотите использовать многомерный минимизатор: более подробная информация подтвердит или опровергнет. –

+0

** a1-5 ** и ** ite ** являются частью одной большой формулы, которая должна приводить к значению в определенном диапазоне. если это так, результат «действителен», и я возвращаю ** 1 **, в противном случае ** 0 **. Однако конечный результат, который мне нужен, является минимальным ** для любого созвездия ** a1-5 **. Поэтому всякий раз, когда выполняются все условия, и ** ite ** меньше, чем какое-либо созвездие, которое до сих пор привело, я сохраняю все текущие значения. – Rugir