Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python np.uint8和np.int8的不同执行时间_Python_Python 3.x_Numpy - Fatal编程技术网

Python np.uint8和np.int8的不同执行时间

Python np.uint8和np.int8的不同执行时间,python,python-3.x,numpy,Python,Python 3.x,Numpy,我有一段代码: #!/usr/bin/env python3 # -*- coding: UTF-8 -*- import time import numpy as np for t in [np.uint8, np.int8]: a=np.empty([480, 640], t) v=[10, 245] for y in range(480): for x in range(640): a[y, x]=v[x&1] # 50%=10, 50%=24

我有一段代码:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import time
import numpy as np

for t in [np.uint8, np.int8]:
  a=np.empty([480, 640], t)
  v=[10, 245]
  for y in range(480):
    for x in range(640):
      a[y, x]=v[x&1]  # 50%=10, 50%=245
  t1=time.clock()
  a[a<32]=0
  a[a>224]=0
  t2=time.clock()
  print("%2.3f ms"%((t2-t1)*1000), a.dtype)

为什么这是
a[a只是为了确保每个人都知道时差的来源,我将代码分解为每个单独的步骤:

整个代码

%%timeit 
tmp = np.array(a, dtype=np.uint8, copy=True)
tmp[tmp < 30] = 0
tmp[tmp > 224] = 0
100圈,最佳3圈:每圈17.9毫秒

100个回路,最佳3个:每个回路16.2毫秒

对于
int8

100次循环,最佳3次:每个循环7.64毫秒

100个回路,最佳3个:每个回路4.3毫秒

但是
int
速度更快。那么如何创建布尔掩码呢

%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
%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]
%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

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

以毫秒为单位的测试有点不确定。您只运行了一次吗?您是否尝试了其他操作在使用
np.int
np.int8
np.uint8
时,我没有明显的时间差异。我在
Ipython
中使用它的
%timeit
。当我运行你的代码时,我只得到
int8
uint8
之间3倍的速度差。而
uint8
运行在同一个ti中我被称为
int32
(和
uint32
)。这意味着只有两种计算路径-一个字节是由
int8
使用的,另一个是整数(4字节)一个。
uint8
可能被转换为
int
用于这些目的。您是否使用了一个填充值的数组,以便每个值都将被更改?有趣的是,如果我将v更改为[100145](对于b[b224]=0没有任何作用),对于int8,我得到1636.1527毫秒,对于uint8,我得到114.9262毫秒。我的真实脚本从一个摄像头获得两幅图像,然后构建差分以检测运动。如果我从int8数组构建差分,我仍然得到390.98毫秒(循环1000次),如果我在uint8数组上进行相同的操作,我仍然得到1383.07毫秒。请参阅:(德语)不,区别不在于
dtype
(我已经用修改后的脚本中的一些示例输入进行了检查)不同的是,
uint
数组有溢出。假设
1-5
with
uint
的结果是252,而
int
的结果是-4。然后,脚本将在第一个操作中为int屏蔽该值,而对于uint,它仅在第二个操作中屏蔽。根据数据类型,程序会执行不同的操作。Th这些不同的东西在速度上是不同的,并不是因为一个是uint,一个是int。@dede-在用零替换之前,你可以通过打印
np.sum(a235)
来检查我的结论,你会注意到由于溢出而产生的差异。正确-
diff[diff>224]=0
用于处理溢出。但即使我无条件(或始终)同时执行
diff[diff..]=0
,我也会得到相同的执行时间。请使用我网站上的最后一个脚本进行尝试:将
diff[diff>224]=0
降低一级。然后脚本运行更多代码(np.absolute())对于有符号数组-但是对于无符号数组,它的执行速度比无符号数组快。但是对于填充了随机[u]int8值的数组或图像的数组,可以尝试一下。很抱歉,这并不是您真正要问的问题:您问到了为什么在您在问题中提到的特定情况下(
uint
的执行时间比
int
(或者反之亦然)我的答案中解释了这一点(或者答案可能是错误的)。如果您想知道为什么
uint
int
执行不同的操作(尤其是使用不同的图像),这超出了原始问题的范围,不应该在这里讨论,而应该在不同的问题中讨论。
%%timeit 
tmp = np.array(a, dtype=np.int8, copy=True)
tmp[tmp < 30] = 0
tmp[tmp > 224] = 0
%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
%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]
%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
uint: 10 loops, best of 3: 21.7 ms per loop
int:  10 loops, best of 3: 23.2 ms per loop