【发布时间】:2015-04-01 08:52:53
【问题描述】:
只是一个简短的问题,在我出发之前我找不到答案,
当我做这样的事情时:
v1 = float_list_python = ... # <some list of floats>
v2 = float_array_NumPy = ... # <some numpy.ndarray of floats>
# I guess they don't have to be floats -
# but some object that also has a native
# object in C, so that numpy can just use
# that
如果我想将这些向量乘以标量,我的理解一直是 python 列表是对象引用的列表,因此循环遍历列表进行乘法必须获取所有浮点数的位置,并且然后必须得到花车才能做到这一点 - 这是它很慢的原因之一。
如果我在 NumPy 中做同样的事情,那么,我不确定会发生什么。我想可能会发生很多事情:
- 它将乘法拆分到各个核心。
- 它矢量化了多阳离子(也是?)
我发现的文档表明,numpy 中的许多原语都尽可能利用第一个选项(目前我手头没有计算机,我可以对其进行测试)。我的直觉告诉我,只要有可能,第二个就应该发生。
所以我的问题是,如果我创建一个 Python 对象的 NumPy 数组,它至少还会并行执行列表上的操作吗?我知道,如果你创建一个对象数组,本机 C 类型,那么它实际上会在实际对象的内存中创建一个连续的数组,如果你创建一个 python 对象的 numpy 数组,它将创建一个引用数组,但我不明白为什么这会排除并行所述列表上的操作,并且找不到任何明确声明的地方。
编辑:我觉得我在问什么有点困惑。我了解向量化是什么,我了解它是一种编译器优化,而不是您必须在其中编程的东西(尽管对齐数据使其在内存中连续很重要)。基于矢量化,我只想知道 numpy 是否使用它。如果我执行np_array1 * np_array2 之类的操作,底层库调用是否使用矢量化(假设dtype 是兼容类型)。
对于内核的拆分,我的意思是,如果我再次执行 np_array1 * np_array2 之类的操作,但这次是 dtype=object:它会在内核之间划分工作吗?
【问题讨论】: