【发布时间】:2015-01-30 20:44:34
【问题描述】:
所以如果我有类似x=np.random.rand(60000)*400-200 的东西。 iPython 的 %timeit 说:
-
x.astype(int)耗时 0.14 毫秒 -
np.rint(x)和np.around(x)需要 1.01 毫秒
请注意,在 rint 和 around 情况下,您仍然需要花费额外的 0.14 毫秒来完成最终的 astype(int)(假设这是您最终想要的)。
问题:我认为大多数现代硬件能够同时执行这两项操作是否正确。如果是这样,为什么 numpy 的舍入时间要长 8 倍?
碰巧我对算术的准确性并不是特别挑剔,但我不知道如何利用 numpy 来利用这一点(我正在做的是混乱的生物学而不是粒子物理学)。
【问题讨论】:
-
承认我对 CPU 的算术能力不是很熟悉:为什么他们能够在相同的时间内完成它? astype 只是切除了一些位,舍入操作需要检查你切除了多少(以确定你是否舍入到较低或较高的 int)。
-
嗯,有一件事是从浮点数转换为整数类型只需丢弃小数部分,这相当于向零舍入,而
np.rint则舍入到最近的 整数(这是额外的工作)。因此,np.trunc与np.astype(int)更具可比性。在我的速度测试中,np.trunc仍然较慢,但是查看source,这可能是因为它是根据 ceil 和 floor 实现的,而不是简单的演员表。 -
似乎有低级标志来控制舍入模式,例如:gcc.gnu.org/wiki/FloatingPointMath。
标签: python c assembly numpy sse