python uint8 int_python – np.uint8和np.int8的不同执行时间

为了确保每个人都知道时差的来源,我将代码分解为每个步骤:

整个代码

%%timeit

tmp = np.array(a, dtype=np.uint8, copy=True)

tmp[tmp < 30] = 0

tmp[tmp > 224] = 0

10 loops, best of 3: 21.6 ms per loop

%%timeit

tmp = np.array(a, dtype=np.int8, copy=True)

tmp[tmp < 30] = 0

tmp[tmp > 224] = 0

100 loops, best of 3: 10.4 ms per loop

所以是的,整个操作更快,但让我们看一下每个设置操作所花费的时间:

%timeit tmp = np.array(a, dtype=np.uint8, copy=True); tmp[tmp < 30] = 0

tmp = np.array(a, dtype=np.uint8, copy=True)

tmp[tmp < 30] = 0

%timeit tmp2 = np.array(tmp, copy=True); tmp2[tmp2 > 224] = 0

100 loops, best of 3: 19.3 ms per loop

100 loops, best of 3: 17.6 ms per loop

因此对于int8,每个设置都需要相同的时间:

100 loops, best of 3: 6.75 ms per loop

100 loops, best of 3: 4.36 ms per loop

让我们看看如果我们只根据索引创建一个新视图会发生什么:

%timeit tmp = np.array(a, dtype=np.uint8, copy=True); _ = tmp[tmp < 30]

tmp = np.array(a, dtype=np.uint8, copy=True)

tmp[tmp < 30] = 0

%timeit tmp2 = np.array(tmp, copy=True); _ = tmp2[tmp2 > 224]

100 loops, best of 3: 17.9 ms per loop

100 loops, best of 3: 16.2 ms per loop

对于int8:

100 loops, best of 3: 7.64 ms per loop

100 loops, best of 3: 4.3 ms per loop

还是int更快.那么创建布尔掩码呢:

%timeit tmp = np.array(a, dtype=np.uint8, copy=True); _ = tmp < 30

tmp = np.array(a, dtype=np.uint8, copy=True)

tmp[tmp < 30] = 0

%timeit tmp2 = np.array(tmp, copy=True); _ = tmp2 > 224

100 loops, best of 3: 4.25 ms per loop

100 loops, best of 3: 2.58 ms per loop

对于int8:

100 loops, best of 3: 4.26 ms per loop

100 loops, best of 3: 4.08 ms per loop

简而言之:在创建布尔掩码时,dtype没有太大区别,但如果使用布尔掩码创建数据的新视图,使用int会更快.但这只是一种错觉,因为实际上numpy看到它访问第一个操作中的所有元素(因为235在get8中被转换为-21)而在第二个操作中没有元素.使用uint时,两个操作的掩码都包含True和False(混合).

简介:numpy可以并且确实优化获取和设置数组的所有/没有元素.

在你提到的评论中,对于uint v = [10,100]更快,但在我的计算机上使用与上面相同的设置它们两者大致相同:

uint: 10 loops, best of 3: 21.7 ms per loop

int: 10 loops, best of 3: 23.2 ms per loop

这是因为现在第一个操作有一个混合的布尔掩码,而numpy不能像设置all / no元素那样优化它.但是第二个操作有一个布尔掩码只有False所以numpy会跳过这个uint和int.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值