首页 > 解决方案 > 使用 numpy.mean 列出比 numpy.array 慢得多

问题描述

我认为将 Numpy 方法直接应用于 Python 列表显然会更慢。我认为它变慢的原因是因为 Numpy 方法,比如说 numpy.mean,会在计算平均值之前将列表转换为数组。但是在尝试了下面的代码之后,情况并非如此:将 list 转换为数组的时间 + 数组的 numpy 平均时间 == list 的 numpy 平均时间。谁能解释为什么?

import numpy as np
from time import time

r = [i for i in range(1000000)]

start_list = time()
np.mean(r)
end_list = time() - start_list

start_array = time()
np.mean(np.array(r))
end_array = time() - start_array

第一个:0.060173988342285156

第二个:0.05114173889160156

标签: numpy

解决方案


只运行一次代码观察挂钟时间并不是衡量其速度的最佳方法,因为结果可能会随机且不可预测地受到其他进程的影响。你应该运行它几次(越多越好)并取平均值。Python 有一个用于此类目的的特殊模块,名为timeit。例如,在我的机器上,我得到以下结果:

from timeit import timeit

setup = """import numpy as np
r = list(range(1000000))"""
n = 100
print(timeit("np.mean(r)", setup=setup, number=n))
print(timeit("np.mean(np.array(r))", setup=setup, number=n))

输出:

4.940829735947773
4.928034849930555

或者使用相应的IPython 魔法

import numpy as np
r = list(range(1000000))
%timeit np.mean(r)
%timeit np.mean(np.array(r))

输出:

49.4 ms ± 189 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
49.5 ms ± 202 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

这意味着执行时间没有显着差异。

我使用 Windows 10、Python 3.7.3 和 numpy 1.16.2。


推荐阅读