为什么python很慢?我怎样才能让它更快?

时间:2021-07-29 17:38:28

标签: python jupyter-notebook

import numpy as np
import random
import matplotlib.pyplot as plt

 # set grid size, M*N (row, col)
 M: int = 5
 N: int = 5

def moves(pos: tuple, dpos: tuple) -> tuple:
     return (pos[0] + dpos[0], pos[1] + dpos[1])


def check_neighbors(white_pos: tuple, black_pos: tuple) -> bool:
  stationary = white_pos
  up = (white_pos[0], white_pos[1] + 1)
  upper_right = (white_pos[0] + 1, white_pos[1] + 1)
  upper_left = (white_pos[0] - 1, white_pos[1] + 1)
  left = (white_pos[0] - 1, white_pos[1])
  right = (white_pos[0] + 1, white_pos[1])
  lower_left = (white_pos[0] - 1, white_pos[1] - 1)
  down = (white_pos[0], white_pos[1] - 1)
  lower_right = (white_pos[0] + 1, white_pos[1] - 1)

  if (black_pos == stationary) or (black_pos == up) or (black_pos == upper_right) or (black_pos == upper_left) or (black_pos == left) or (black_pos == right) or (black_pos == lower_left) or (black_pos == down) or (black_pos == lower_right):
    return True
else:
    return False
def run_sim():
 w_x0 = random.sample([i for i in range(0,M)], 1)
 w_y0 = random.sample([j for j in range(0,N)], 1)

 b_x0 = random.sample([i for i in range(0,M)], 1)
 b_y0 = random.sample([j for j in range(0,N)], 1)


 white = [(x,y) for x, y in zip(w_x0, w_y0)]
 black = [(x,y) for x, y in zip(b_x0, b_y0)]
 stop: bool = False
 n: int = 0
 t: int = 0
 while stop != True:
    if check_neighbors(white[n], black[n]) == True:
        stop = True
    else:
        dt_w = random.sample([i for i in range(-1,2)], 2)
        dt_bl = random.sample([i for i in range(-1,2)], 2)
        white.append(moves(white[n], dt_w))
        black.append(moves(black[n], dt_bl))
        t = t+1
        n = n+1
 return n

  t_dist = [run_sim() for i in range(100)]
  print(t_dist)

请原谅糟糕的格式

当它到达 t_dist = [run_sim() for i in range(100)] 时,它需要永远运行(我的意思是超过 60 秒)。我怎样才能让它运行得更快并得到我的结果?为什么计算成本如此之高?

我正在使用 jupyter 笔记本。我还尝试将它作为 .py 文件简单地运行,但它仍然很慢。我尝试使用调试器,在 t_dist = 处设置断点后,它只显示几次迭代然后停止。如果我将它设置为 range(5),它就可以正常工作,但会开始出现更大的数字(即 100、10000),这就是我想要运行的模拟。

1 个答案:

答案 0 :(得分:0)

如果你只想知道分布,你应该定义max_t并调整值。

def check_neighbors(a,b):
    return abs(a[0]-b[0]) + abs(a[1]-b[1]) <= 1 or\
 (abs(a[0]-b[0])==1 and abs(a[1]-b[1])==1)
def moves(a,b):
    return (a[0]+b[0], a[1]+b[1])
def run_sim(M=5, N=5, max_t=10**6):
    w_co = [random.randrange(0,M), random.randrange(0,N)]# to produce random integer, you can use randrange
    b_co = [random.randrange(0,M), random.randrange(0,N)]

    t: int = 0
    while t<max_t:
        if check_neighbors(w_co, b_co) is True: # for bool, `is True` is strict
            break
        else:
            dt_w = [random.randrange(-1,2) for _ in range(2)]
            dt_b = [random.randrange(-1,2) for _ in range(2)]
            w_co=moves(w_co, dt_w)
            b_co=moves(b_co, dt_b)
            t+=1
            if (t%(max_t//20)==0):
                print(f"\t{t}") # check if the program is processing or not
    return t

t_dist = []
for i in range(100):
    if (i%10==1):
        print(i) # check the process
    t_dist.append(run_sim(M=5, N=5, max_t=10**6))
print(t_dist)

此外,这是示例的直方图。 图表显示,有些案例需要非常、非常长的时间。

enter image description here