为什么整数指数的numpy.power较慢?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么整数指数的numpy.power较慢?相关的知识,希望对你有一定的参考价值。
我随机选择了这些数字,但这些结果似乎是一致的 - 浮点指数比整数指数快25%-50%。这些处理方式有何不同?
In [209]: %timeit -n 100000 -r 100 np.power(3.71242, 7)
100000 loops, best of 100: 3.45 µs per loop
In [210]: %timeit -n 100000 -r 100 np.power(3.71242, 7.0)
100000 loops, best of 100: 1.98 µs per loop
np.power
是一个universal function(ufunc)。这些函数可用于具有各种不同数据类型的标量和数组,但必须首先检查输入值的类型,以便它们可以确定使用哪个内部循环来生成合适的输出值。
如果输入类型没有映射到任何ufunc的预定义循环,则ufunc将尝试cast the input values to suitable types(除非另有说明)。这种输入值的检查和转换具有与之相关的性能成本,解释了在问题中观察到的时序。
ufunc的types
属性显示输入数据类型将如何映射到输出数据类型。以下是np.power
的映射列表:
>>> np.power.types # 'input input -> output'
['bb->b', 'BB->B', 'hh->h', 'HH->H', 'ii->i', 'II->I', 'll->l', 'LL->L', 'qq->q',
'QQ->Q', 'ee->e', 'ff->f', 'dd->d', 'gg->g', 'FF->F', 'DD->D', 'GG->G', 'OO->O']
浮点数属于字符代码'g'
,Python整数属于'l'
。可以找到这些字符代码的完整列表here。
请注意,对于此ufunc,两个输入值的数据类型必须相同。例如,没有float
和int
输入数据类型混合的映射。
但我们仍然可以为np.power
提供不同的数据类型,并让它将值转换为适当的数据类型。对于float
和int
,返回float64
数字:
>>> np.power(3.71242, 7).dtype
dtype('float64')
上面你可以看到映射到float64
字符代码g
的唯一输入是另外两个g
值:'gg->g'
。
所以,在幕后,np.power(3.71242, 7)
采用了Python float
和Python int
,并且必须决定它可以安全地重铸哪种类型。 int
值被安全地提升为浮点型g
。然后ufunc知道要运行哪个循环并返回另一个g
值。
因此,不混合输入数据类型会为qazxsw poi带来更好的性能。
以上是关于为什么整数指数的numpy.power较慢?的主要内容,如果未能解决你的问题,请参考以下文章