我正在尝试模拟抛硬币和利润,并在matplotlib中绘制图表:
from random import choice
import matplotlib.pyplot as plt
import time
start_time = time.time()
num_of_graphs = 2000
tries = 2000
coins = [150, -100]
last_loss = 0
for a in range(num_of_graphs):
profit = 0
line = []
for i in range(tries):
profit = profit + choice(coins)
if (profit < 0 and last_loss < i):
last_loss = i
line.append(profit)
plt.plot(line)
plt.show()
print("--- %s seconds ---" % (time.time() - start_time))
print("No losses after " + str(last_loss) + " iterations")
最终结果是
--- 9.30498194695 seconds ---
No losses after 310 iterations
为什么运行这个脚本需要这么长时间?如果我将num_of_graphs
更改为10000,脚本将永远不会结束。
您将如何优化此功能?
发布于 2018-07-28 12:03:37
您对执行时间的测量太粗糙了。以下内容允许您测量模拟所需的时间,而不同于打印所需的时间:
它正在使用numpy。
import matplotlib.pyplot as plt
import numpy as np
import time
def run_sims(num_sims, num_flips):
start = time.time()
sims = [np.random.choice(coins, num_flips).cumsum() for _ in range(num_sims)]
end = time.time()
print(f"sim time = {end-start}")
return sims
def plot_sims(sims):
start = time.time()
for line in sims:
plt.plot(line)
end = time.time()
print(f"plotting time = {end-start}")
plt.show()
if __name__ == '__main__':
start_time = time.time()
num_sims = 2000
num_flips = 2000
coins = np.array([150, -100])
plot_sims(run_sims(num_sims, num_flips))
结果:
sim time = 0.13962197303771973
plotting time = 6.621474981307983
正如您所看到的,sim时间大大减少了(在我2011年的笔记本电脑上大约是7秒);绘图时间取决于matplotlib。
发布于 2018-07-29 09:10:11
为了更好地优化您的代码,我总是尝试使用numpy的矢量化来替换循环,或者,根据我的特定需求,在引擎盖下使用numpy的其他库。
在这种情况下,您可以这样计算和绘制您的利润:
import matplotlib.pyplot as plt
import time
import numpy as np
start_time = time.time()
num_of_graphs = 2000
tries = 2000
coins = [150, -100]
# Create a 2-D array with random choices
# rows for tries, columns for individual runs (graphs).
coin_tosses = np.random.choice(coins, (tries, num_of_graphs))
# Caculate 2-D array of profits by summing
# cumulatively over rows (trials).
profits = coin_tosses.cumsum(axis=0)
# Plot everything in one shot.
plt.plot(profits)
plt.show()
print("--- %s seconds ---" % (time.time() - start_time))
在我的配置中,这段代码使用了aprox。6.3秒(6.2绘图),而您的代码几乎花了15秒。
https://stackoverflow.com/questions/51567751
复制相似问题