我认为将Numpy方法直接应用于Python列表显然很慢。我认为它变慢的原因是因为Numpy方法(例如numpy.mean)会在计算均值之前将列表转换为数组。但是尝试下面的代码后,不的情况是:将列表转换为数组的时间+数组的numpy的时间==列表的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
答案 0 :(得分:1)
仅在观看挂钟时间后才运行代码不是衡量其速度的最佳方法,因为结果可能会随机且不可预测地受到其他进程的影响。您应该运行几次(越多越好)并取平均值。 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 magic:
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。