为什么这个带有 Matplotlib 的 Python 脚本这么慢?

J0N*_*D03 5 python performance matplotlib

我正在尝试模拟硬币抛掷和利润并在 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")
Run Code Online (Sandbox Code Playgroud)

最终结果是

--- 9.30498194695 seconds ---
No losses after 310 iterations
Run Code Online (Sandbox Code Playgroud)

为什么运行这个脚本需要这么长时间?如果我更改num_of_graphs为 10000,脚本将永远不会完成。

你会如何优化这个?

Jypiter 中运行的脚本的屏幕截图

Reb*_*que 4

您对执行时间的衡量太粗略了。以下允许您测量模拟所需的时间,与绘图所需的时间分开:

它正在使用 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))
Run Code Online (Sandbox Code Playgroud)

结果:

sim time = 0.13962197303771973
plotting time = 6.621474981307983
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,SIM 时间大大缩短(在我 2011 年的笔记本电脑上大约为 7 秒);绘图时间取决于 matplotlib。