提高循环速度

2024-05-14 07:39:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一百万圈要做。有没有办法更快地处理这个(以及一般的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)

Tags: oftheinnumpyforrangepopperiod
2条回答

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

  1. 使你在循环中做的事情更快,这样计算机就可以做更少的工作来达到同样的结果。只有当您能够发现代码中的低效并修复它们时,这种方法才有效
  2. 同时运行多个循环(即,不是1个线程执行1M任务,而是4个线程分别执行250k任务)。只有当您有多个处理器可以并行工作时,这才有效并且您正在做的工作不需要在其持续时间内独占使用共享资源(例如磁盘)

用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是可行的

相关问题 更多 >

    热门问题