我刚才注意到,我的脚本执行时间几乎减少了一半。 只是把乘法改为除法。 在
为了调查这个,我写了一个小例子。 import numpy as np
导入时间it
# uint 8阵列
ARR1=NP.random.randint(0,high=256,size=(100,100 ),dtype=np.uint8) )
#浮动32阵列
arr2=NP.random.rand (100,100 ).as type (NP.float 32 ) )。
arr2 *=255.0
默认值(a ) :
''''
多写迭代器
''''
b=a.copy () )。
foriteminNP.nditer(b,op_flags=['readwrite'] ) :
item[.]=(item5) * 0.5
默认值2 (a ) :
''''
多址,索引迭代器
''''
b=a.copy () )。
for i,jinNP.ndindex(b.shape ) :
b[i,j]=(b[I,j] 5) * 0.5
defarrmult3(a ) :
''''
mult,vectorized
''''
b=a.copy () )。
B=(B5 ) * 0.5
defarrdiv(a ) :
''''
div,读写迭代器
''''
b=a.copy () )。
foriteminNP.nditer(b,op_flags=['readwrite'] ) :
item[.]=(item5)/2
defarrdiv2(a ) :
''''
div,索引迭代器
''''
b=a.copy () )。
for i,jinNP.ndindex(b.shape ) :
b[i,j]=(b[I,j] 5)/2
defarrdiv3(a ) :
''''
div,vectorized
''''
b=a.copy () )。
B=(B5 )/2
defprint_time(name,t ) :
print(:10 ) : (:6.4 f ) s ).format (name,t ) ) ) ) ) ) ) )。
timeit_iterations=100
打印(uint 8阵列) ) )。
print_time(arrmult ),timeit.timeit ) arrmult(arr1),from __main__ import arrmult,arr1),number
print_time(arrmult2)、timeit.timeit ) arrmult2) arr1)、from __main__ import arrmult2、arr1)、nummort
print_time(arrmult3)、timeit.timeit ) arrmult3) arr1)、from __main__ import arrmult3、arr1)、nummort
print_time(arrdiv )、timeit.timeit ) arrdiv(arr1)、from __main__ import arrdiv、arr1)、number=
print_time(arrdiv2)、timeit.timeit ) arrdiv2) arr1)、from __main__ import arrdiv2、arr1)、number
print_time(arrdiv3)、timeit.timeit ) arrdiv3) arr1)、from __main__ import arrdiv3、arr1)、number
打印((n float 32 arrays ) ) ) ) )。
print_time(arrmult )、timeit.timeit ) arrmult(arr2)、from __main__ import arrmult、arr2)、number
print_time(arrmult2)、time it.time it (arr mult2)、arr2)、from __main__ import arrmult2、arr2)、numportarart
print_time(arrmult3)、timeit.timeit ) arrmult3) arr2)、from __main__ import arrmult3、arr2)、nummort
print_time(arrdiv )、timeit.timeit ) arrdiv(arr2)、from __main__ import arrdiv、arr2)、number=
print_time(arrdiv2),timeit.timeit ) arrdiv2(arr2),) from __main__ import arrdiv2,arr2),number
print_time(arrdiv3)、timeit.timeit ) arrdiv3) arr2)、from __main__ import arrdiv3、arr2)、number
这将打印以下时间:
^{pr2}$
我以为乘法在计算上比除法便宜。 但是,在uint8中,除法的效果几乎是前者的两倍。 这需要计算* 0.5和浮点乘法,并将结果转换为整数吗? 在
至少在浮动的情况下,乘法似乎比除法快。 这通常是真的吗? 在
为什么uint8的乘法比float32的乘法膨胀? 你以为8位无符号整数应该比32位浮点运算快得多吗? 在
有人“解开”这个谜题吗? 在
编辑:为了获得更多的数据,添加了索引迭代器,包括建议的矢量化函数。 矢量化的函数快得多,所以没有真正的可比性。 但是,将量化函数的timeit_iterations设置得较高会加快uint8和{}的乘法速度。 你觉得更困惑吗? 在
乘法实际上可能总是比除法快,但for循环的主要性能漏洞不是算术运算,而是循环本身。 虽然这并不能解释循环在不同操作中不同的原因。 在
正如edit2:@jotasi先生所述,我们正在寻找division和{}以及{}{或}}和{}{或}}的完整说明。 另外,说明矢量化方法和迭代器的趋势也很有趣。 矢量化时,除法似乎很慢,迭代程序似乎很快。 在