提高python for循环的速度

时间:2017-11-29 20:23:43

标签: python performance for-loop

我正在尝试计算从1到10 ^ 7的数字分区数。我使用五边形数定理来实现它,这提供了一种计算n的分区数的方法,我们称之为P(n)= P(n-1)+ P(n-2) - P(n- 5) - P(n-7)+ ...... 因此P(n)取决于不同的P(n-x),其中x从1变为n。无论如何,长话短说,我使用两个循环,一个从1到10 ^ 7,另一个使用x定义并在特定公式后计算。可以想象,代码变得非常慢。有什么方法可以提高这些for循环的速度吗?

P.S。我曾尝试使用numpy数组,但我对它们并不熟悉,不幸的是它使代码更慢。

def build_list(new_limit, k):
   list_of_p_minus = list()
   while k < new_limit:
       list_of_p_minus.append(k*(2*k-1))
       list_of_p_minus.append(k*(2*k+1))
       k = k+1
   return list_of_p_minus


def counter(low, high):
   current = low
   while current <= high:
      yield current
      current += 1

def loop_through_numbers(limit, list_of_p_minus):
   p_dict = dict()
   p_dict[0] = 1
   p_dict[1] = 1
   aux = 2
   aux_index = 1
   for number in counter(2, limit+1):
      if aux == number:
         if aux_index % 4 == 1 or aux_index % 4 == 2:
            p_dict[number] = -1
         else:
            p_dict[number] = 1
         aux = aux + (aux_index + 1) * 2
         aux_index += 1
      else:
         p_dict[number] = 0
      for element in counter(0, len(list_of_p_minus)):
          if element % 4 == 0 or element % 4 == 1:
             try:
                p_dict[number] += p_dict[number-list_of_p_minus[element]]
             except KeyError:
                break
          else:
             try:
                p_dict[number] -= p_dict[number-list_of_p_minus[element]]
             except KeyError:
                break
return

正如您所看到的,我尝试实现迭代器,虽然这使得代码运行得更快,但仍然需要花费大量时间。在这一点上,任何想法都会受到欢迎......

1 个答案:

答案 0 :(得分:2)

m = a % 4
if m == 1 or m == 2:

比两次评估mod快。你的代码中有两个地方可以改进,但这不会增加很多速度。问题在于,除了重组整个事情外,没有太多工作要做。但问题属于codereview.SE

或者你可以使用C而不是python,如果你真的想用特定的实现细节削减毫秒。