首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么这个带有Matplotlib的Python脚本这么慢?

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

Stack Overflow用户
提问于 2018-07-28 11:26:01
回答 2查看 2.7K关注 0票数 4

我正在尝试模拟抛硬币和利润,并在matplotlib中绘制图表:

代码语言:javascript
复制
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")

最终结果是

代码语言:javascript
复制
--- 9.30498194695 seconds ---
No losses after 310 iterations

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

您将如何优化此功能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-28 12:03:37

您对执行时间的测量太粗糙了。以下内容允许您测量模拟所需的时间,而不同于打印所需的时间:

它正在使用numpy。

代码语言:javascript
复制
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))

结果:

代码语言:javascript
复制
sim time = 0.13962197303771973
plotting time = 6.621474981307983

正如您所看到的,sim时间大大减少了(在我2011年的笔记本电脑上大约是7秒);绘图时间取决于matplotlib。

票数 4
EN

Stack Overflow用户

发布于 2018-07-29 09:10:11

为了更好地优化您的代码,我总是尝试使用numpy的矢量化来替换循环,或者,根据我的特定需求,在引擎盖下使用numpy的其他库。

在这种情况下,您可以这样计算和绘制您的利润:

代码语言:javascript
复制
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秒。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51567751

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档