我有一些代码:
map_ret = map(lambda x: x*x, Array)
Array
是一些带有浮点数的numpy数组。
map_ret
是一个地图对象。
我想从map_ret
获取列表。
result = list(map_ret)
但是当我的数组包含1000000个数字时,它变得很慢。
如何更快地从地图对象获取值?
答案 0 :(得分:0)
您可以将函数应用于输入本身,从而完全绕过map()
。在我的机器上,这种方法大约是。对于大小为map()
的输入,比1_000_000
快2个数量级。不过,如果您确实需要一个列表作为输出,则可以对生成的.tolist()
使用np.ndarray()
,这仍然是大约。比使用map()
快1个数量级。
import numpy as np
arr = np.arange(1000000).astype(float)
def my_func(x):
return x * x
%timeit list(map(my_func, arr))
# 203 ms ± 3.25 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit my_func(arr)
# 1.6 ms ± 24.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit my_func(arr).tolist()
# 33.8 ms ± 471 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
只需评论NumPy数组上的“不使用map()
”即可。如果输入的不是NumPy数组,而是一个列表,例如:
list_ = [float(x) for x in range(1000000)]
%timeit list(map(my_func, list_))
# 114 ms ± 1.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit my_func(np.array(list_)).tolist()
# 64.4 ms ± 382 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
在NumPy的数组上,map()
方法肯定比在列表上慢,并且最终来回穿过NumPy仍然大约。是列表上直接map()
的两倍。
这就是为什么您收到一些反对在NumPy对象上使用map()
的评论的原因,因为NumPy通常可以为典型的map()
用例提供更快的替代方法。