从地图对象创建列表的最快方法

时间:2019-02-18 17:39:43

标签: python python-3.x dictionary

我有一些代码:

map_ret = map(lambda x: x*x, Array)

Array是一些带有浮点数的numpy数组。

map_ret是一个地图对象。

我想从map_ret获取列表。

result = list(map_ret)

但是当我的数组包含1000000个数字时,它变得很慢。

如何更快地从地图对象获取值?

1 个答案:

答案 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()用例提供更快的替代方法。