我想画出一些随机游走的图。我听说numpy数组比列表快得多。但是我的数组操作所花费的时间是我的列表操作的两倍到三十倍。我做错了什么?
from random import random
import numpy as np
import matplotlib.pyplot as plt
import time
t0 = time.time()
rw1 = list()
rw1.append(-1 if random() < 0.5 else 1)
for i in range(1, 10000):
movement = -1 if random() < 0.5 else 1
rw1.append(rw1[i-1] + movement)
t1 = time.time()
rw2 = [0]
rw2_array = np.array(rw2, dtype=int)
for i in range(1, 10000):
movement = -1 if random() < 0.5 else 1
rw2_array = np.append(rw2_array, rw2_array[i-1] + movement)
t2 = time.time()
rw3 = np.zeros(10000)
for i in range(1, 10000):
movement = -1 if random() < 0.5 else 1
rw3[i] = rw3[i-1] + movement
t3 = time.time()
print("time: ", t1-t0, t2-t1, t3-t2)
1条答案
按热度按时间3hvapo4f1#
你不应该迭代numpy数组。相反,构建移动数组,然后计算随机游走。我们可以通过为大小为10000的数组随机选择+1或-1来构建移动。要得到随机游走,可以使用累积和方法。
这些操作发生在C层,比原生Python中的操作快得多。通过在numpy数组上迭代,您将从C中取出整数并为每个数字创建一个Python对象。由于创建每个对象的开销,此过程很慢。
通过使用numpy中的函数和方法,您可以将调用传递到C层以执行所有操作。