英文:
My Array manipulations are slower than my list manipulations
问题
我想绘制一些随机漫步图。我听说 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)
英文:
I want to plot some random walks. I have heard that numpy arrays are alot faster than lists. But my array manipulations take twice to thirty times as long as my list manipulations. What am i doing wrong?
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
得分: 1
你不应该在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层,在那里执行所有操作。
英文:
You should not be iterating over numpy arrays. Instead build the array of movements and then calculate the random walk. We can build the movements by randomly selecting +1 or -1 for an array of size 10000. To get the random walk, you can use the cumulative sum method.
import numpy as np
movements = np.random.choice([-1, 1], size=10000)
rw = movements.cumsum()
The operations take place at the C layer and are significantly faster than operations in native Python. By iterating over the numpy array, you are taking the integer out of C and creating a Python object for each number. This process is slow because of the overhead in creating each object.
By using the functions and methods in numpy, you are passing calls to the C layer to do all of the operations there.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论