【发布时间】:2017-07-10 10:39:55
【问题描述】:
我有一个函数f,例如:
def f(x):
return x**2
并希望获得一个由f 组成的数组,该数组在一个区间内进行评估,例如单位区间 (0,1)。我们可以这样做:
import numpy as np
X = np.arange(0,1,0.01)
arr = np.array(list(map(f, X)))
但是,当函数很复杂时,最后一行非常耗时(在我的例子中,它涉及一些积分)。有没有办法更快地做到这一点?我很高兴有一个不优雅的解决方案 - 重点是速度。
【问题讨论】:
-
如果
X的长度不是很大,我不会担心map()的开销。花时间优化您的f()。 -
这不是您问题的答案,但是仅仅为了创建一个数组而构建一个列表是非常低效的。您可以使用
fromiter()来避免这样做。您需要知道长度,但鉴于它是一个映射操作,您知道它将与您映射的数组相同。但是,如果您想使用 Numpy 提高速度,则需要使用 numpy 操作 - 映射本质上意味着 python 端循环和操作,这会更慢。 -
@zwer 同意。您可以使用列表理解获得一些加速,但它不会显着改变整体运行时间。查看我为回答 this question 所做的一些实验
-
@GarethLatty 实际上,我认为如果您只是将代码重构为一个 for 循环,该循环采用
np.empty数组并通过索引分配正确的值,它会比fromiter更快,不确定尽管。fromiter通常很慢,numpy数组几乎是 C 数组,并且零碎地构建它根本没有效率。如果在后台,fromiter将迭代器消耗到列表中,我不会感到惊讶...... -
@juanpa.arrivillaga 文档说:'Specify count to improve performance. It allows fromiter to pre-allocate the output array, instead of resizing it on demand.' - 听起来在这种情况下它会做最好的事情 - 至少与制作列表或多次调整大小相比。
标签: python arrays python-3.x numpy dictionary