我有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)
答案 0 :(得分:0)
通常有两种方法可以使循环更快:
答案 1 :(得分:0)
用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是可行的。