numpy 我的数组操作比列表操作慢

7qhs6swi  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(108)

我想画出一些随机游走的图。我听说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)
3hvapo4f

3hvapo4f1#

你不应该迭代numpy数组。相反,构建移动数组,然后计算随机游走。我们可以通过为大小为10000的数组随机选择+1或-1来构建移动。要得到随机游走,可以使用累积和方法。

import numpy as np

movements = np.random.choice([-1, 1], size=10000)
rw = movements.cumsum()

这些操作发生在C层,比原生Python中的操作快得多。通过在numpy数组上迭代,您将从C中取出整数并为每个数字创建一个Python对象。由于创建每个对象的开销,此过程很慢。
通过使用numpy中的函数和方法,您可以将调用传递到C层以执行所有操作。

相关问题