首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么python不能矢量化map()或列表理解

为什么python不能矢量化map()或列表理解
EN

Stack Overflow用户
提问于 2019-09-21 05:44:01
回答 2查看 488关注 0票数 2

我对矢量化知之甚少,但我很感兴趣的是,为什么像python这样的语言不能通过库接口为可迭代对象提供矢量化,就像它提供线程支持一样。我知道许多numpy方法都是矢量化的,但它可能会限制必须使用numpy进行泛型计算。

我目前的理解是,即使函数与"SIMD“模式匹配,python也不能向量化函数。例如,在理论上,任何列表理解或map()函数的使用都不应该是可向量化的,因为它们输出的列表是在输入列表的独立输入上运行相同函数的结果?

凭我的粗浅理解,似乎每当我使用map()时,从理论上讲,我应该能够创建一个表示函数的指令集;然后,输入中的每个元素只需要通过编译的相同函数运行即可。设计一个提供simd_map(func, iterable)的工具,它试图“及时”编译func,然后从iterable获取批输入,并利用处理器的simd功能通过func()运行这些批处理,这在技术上有什么挑战

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2019-09-21 05:57:53

map应用的操作是任意Python代码。CPython是一个解释器,而不是一个即时编译器。

CPython可能有一些预制的C函数(作为解释器的一部分提前编译),用于数组上的单指令多数据操作,但它没有AFAIK。即便如此,它也必须将提供的func优化为可以进行模式识别的东西,以注意到它正在进行a[i] = max(a[i], some_value)

但通常CPython不会这样做;解释器开销对于循环数组的元素来说是一个巨大的问题。CPython是nowhere ,接近,原生标量循环的性能,所以即使没有自动向量化,也有巨大的收益空间。是200倍慢的IIRC的因子。例如,Why are bitwise operators slower than multiplication/division/modulo?表明,一些操作甚至没有小整数的“快速路径”,并且开销足以使&比内部使用硬件除法指令的//慢。

此外,CPU列表不是作为int32_t double的简单连续数组存储的,所以 SIMD无论如何都不是高效的。这就是numpy数组的特殊之处:它们确实像基元类型的C数组一样存储值。

(注意:我几乎不了解Python,也不经常使用它。但我认为我知道的足够让这个答案是正确的:这是一个用C编写的解释器,它不会执行任何本地机器代码的即时生成。唯一可以运行的本机循环是作为解释器的一部分或在NumPy库中预编译的循环。)

票数 6
EN

Stack Overflow用户

发布于 2019-09-21 06:37:09

你想使用numba、pypy或cython进行矢量化或JIT编译,但要注意的是,速度是以灵活性为代价的。

numba是一个python模块,它可以为你jit编译某些函数,但是它不支持很多类型的输入和一些(许多) python结构上的barf。当它工作时,它真的很快,但可能很难争论。它在处理numpy数组方面也非常有针对性。

pypy是cpython解释器的完全替代品,cpython解释器是JIT。它支持整个python规范,但不能很好地与扩展集成,因此一些库将无法工作。

cython是python的一个扩展,它被编译成一个二进制文件,它的行为就像一个python模块。然而,它确实需要您使用特殊的语法来利用速度增益,并要求您显式地将事物声明为ctype才能真正获得任何优势。

我的建议是:如果您是纯python,请使用pypy。(如果它对你有效,基本上是毫不费力的)如果你需要加速数值计算,而numpy没有很好的方法可以做到这一点。如果你需要更快的速度,可以使用cython,其他两种方法都不起作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58035479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档