如何加速百万次迭代的蒙特卡洛模拟器循环运行速度?
蒙特卡洛模拟器性能优化求助
我正在开发一款简易蒙特卡洛模拟器,它接收3×4概率矩阵与模拟迭代次数,输出包含所有结果的表格,每行格式为[迭代编号、随机数、结果1、结果2]。核心逻辑为生成随机数并与累积概率比较,当设置100万次迭代时,运行耗时超16秒,希望找到优化速度的方法。
已尝试的方案
- 记忆化(memoization):因返回数据依赖随机数,无实际作用
- 使用numpy数组及
cumsum()方法计算累积概率 - 采用由可能结果组成的元组列表与二维列表存储概率的最优数据结构
附代码
from random import random import numpy as np matrix = [ [0.2, 0.2, 0.05, 0.1], [0.7, 0.5, 0.6, 0.4], [0.2, 0.25, 0.2, 0.04], ] estados = [ ("buena", "buena"), ("buena", "regular"), ("buena", "critica"), ("buena", "alta"), ("regular", "buena"), ("regular", "regular"), ("regular", "critica"), ("regular", "alta"), ("critica", "buena"), ("critica", "regular"), ("critica", "critica"), ("critica", "alta"), ] estado_siguiente = {"buena": 0, "regular": 1, "critica": 2, "alta": 3} def get_result(rnd, probabilities, sig_estado=None): probabilities= ( probabilities[0] if (sig_estado == "" or sig_estado == "alta") else probabilities[estado_siguiente[sig_estado] + 1] ) for i in range(len(probabilities[0])): if rnd < probabilities[0][i]: return probabilities[1][i] return probabilities[1][len(probabilities) - 1] def start_simulation(probabilities, iter): vector_estado = [0, 0, "", "", 0, ""] table_final = list() # 这里针对3行概率分别设置了4个累积器,还有一个全表累积器——因为新的result1依赖前一个result2,有时只需要某一行的概率 to_np_arr = np.array(probabilities) all_acc = (np.cumsum(to_np_arr), estados[:]) buena_acc = (all_acc[0][0:4], estados[0:4]) regular_acc = (all_acc[0][4:8], estados[4:8]) critico_acc = (all_acc[0][8:], estados[8:]) for _ in range(iter): rnd1 = random() estado1, estado2 = definir_condicion( rnd1, probabilities=[all_acc, buena_acc, regular_acc, critico_acc], sig_estado=vector_estado[3], ) # 将当前状态添加到结果表 tabla_final.append(vector_estado) # 更新状态为新的迭代数据 vector_estado = [ vector_estado[0] + 1, "%.3f" % (rnd1), estado1, estado2, "%.3f" % (rnd2) if rnd2 else "-", condicion_alta, ] return tabla_final
内容的提问来源于stack exchange,提问作者Xcecution
相关产品推荐
相关产品推荐

