【问题标题】:Increasing the loop speed提高循环速度
【发布时间】:2019-11-13 23:38:41
【问题描述】:

我有 100 万个循环要做。无论如何处理这个(和一般的python循环)更快?

import numpy
#in a population of 1000 individuals of the same species, one individual has an advantageous mutation
#before, the average quantity of newborns per each 2 individuals per generation was 2 (no average change in pop)

popN, popM= 999, 1
period= 1000

reproductionDistN=[0.1, 0.2, 0.41, 0.19, 0.1] #expected value= 1.95
reproductionDistM=[0.1, 0.2, 0.39, 0.21, 0.1] #expected value= 2.05

def reproduce(pop, reproductionDist):
    newborns=numpy.random.choice(numpy.arange(0,5), p=reproductionDist) #numpy.arange(0,5)=[0, 1, 2, 3, 4]
    pop+=newborns
    return pop

for t in range(period):
    for n in range(popN): popN=reproduce(popN, reproductionDistN)  
    for m in range(popM): popM=reproduce(popM, reproductionDistM) 

print("Population of N:",popN)
print("Population of M:",popM)

【问题讨论】:

    标签: python performance loops


    【解决方案1】:

    通常有两种方法可以加快循环速度:

    1. 让您在循环中执行的操作更快,从而使计算机执行更少的工作来获得相同的结果。这只有在您能够发现代码中的低效率问题并加以修复时才有效。
    2. 同时运行多个循环(即,不是 1 个线程执行 1M 的事情,而是让 4 个线程每个执行 250k 的事情)。这仅适用于您有多个可以并行执行工作的处理器并且您正在执行的工作不需要在其持续时间内独占使用共享资源(例如磁盘)。李>

    【讨论】:

      【解决方案2】:

      用 numpy 数组操作替换 python 循环通常有助于提高性能。

      在你的例子中,你有效地做到了

      pop = 100  # for example
      
      for i in range(pop):
          pop += np.random.choice(5, p=reproductionDistM)
      

      在每次迭代中。

      所有采样和求和都可以在 numpy 中完成,无需循环:

      pop = 100
      pop += np.random.choice(5, p=reproductionDistM, size=pop).sum()
      

      在我的机器上,这提供了很大的加速(多少取决于 pop 的值,例如大约 100)。

      另一方面,如果数组很大,这会浪费大量 RAM。在这种情况下,我经常发现通过批量使用 numpy 来平衡速度和 RAM 是很实用的。

      【讨论】:

        猜你喜欢
        • 2015-03-24
        • 1970-01-01
        • 2019-08-01
        • 2014-07-27
        • 1970-01-01
        • 2017-10-06
        • 2014-01-20
        • 2017-01-28
        • 1970-01-01
        相关资源
        最近更新 更多