|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
大佬们,python的for循环嵌套两层运行为啥这么慢阿,有没有好的解决办法,最好是不用三方库的
我这就两层循环,101*1000,感觉好慢
- import matplotlib.pyplot as plt
- import numpy as np
- np.random.seed(0)
- x_ = np.linspace(0,1,101)
- def shouyi():
- '''
- 输入
- '''
- a = np.random.choice([0,1], p = p.ravel())
- b = np.random.choice([0,1], p = p.ravel())
- c = a+b
- if c == 0:
- w = 2
- elif c == 1:
- w = 2
- elif c == 2:
- w = -1
- return w
- y_ = []
- for x in x_:
- p = np.array([ x, 1-x ])
- w = 0
- for i in range(1000):
- w1 = shouyi()
- w2 = shouyi()
- w3 = shouyi()
- w4 = shouyi()
- w5 = shouyi()
- w6 = shouyi()
- w7 = shouyi()
- w8 = shouyi()
- w9 = shouyi()
- w10 = shouyi()
- w = w + w1+w2+w3+w4+w5+w6+w7+w8+w9+w10
- y_.append(w)
- plt.plot(x_,y_)
- plt.show()
复制代码
本帖最后由 suchocolate 于 2021-11-10 22:52 编辑
算上函数那10次,实际有100w次核心计算,numpy确实慢,帮你优化了一下代码,节省20%时间吧。
- import matplotlib.pyplot as plt
- import numpy as np
- import time
- start = time.time()
- np.random.seed(0)
- x_ = np.linspace(0, 1, 101)
- y_ = []
- ps = x_[::-1] # 直接取反不用逐个计算
- d = {0: 2, 1: 2, 2: -1} # 字典查询能够加速
- for i, x in enumerate(x_):
- p = [x, ps[i]]
- w = 0
- for j in range(1000):
- for k in range(10):
- c = np.random.choice([0, 1], p=p, size=2).sum() # 一次生成2个直接求和,p是普通列表页可以。
- w += d[c]
- y_.append(w)
- end = time.time()
- print(end-start)
- plt.plot(x_, y_)
- plt.show()
复制代码
用普通random帮你写了一个,这个1秒多:
- import matplotlib.pyplot as plt
- import time
- import random
- # 权重选择函数
- def test(p):
- result = 0
- for m in range(2):
- r = random.uniform(0, 1) # 随机一个浮点数
- if r <= p[0]: # p中的概率也可以理解为权重,概率=权重/权重和,若权重某一轮为[0.2,0.8],若随机数小于等于0.2,那么本轮结果为0,反之为1。
- result += 0
- else:
- result += 1
- return result
- start = time.time()
- x_ = [x / 100.0 for x in range(101)]
- y_ = []
- ps = x_[::-1]
- d = {0: 2, 1: 2, 2: -1}
- for i, x in enumerate(x_):
- p = {0: x, 1: ps[i]}
- w = 0
- for j in range(1000):
- for k in range(10):
- c = test(p)
- w += d[c]
- y_.append(w)
- end = time.time()
- print(end - start)
- plt.plot(x_, y_)
- plt.show()
复制代码
前几天一位鱼友的提问也是权重选择: https://fishc.com.cn/thread-204828-1-1.html
|
|