首页 > 编程知识 正文

python乘法函数,numpy 矩阵相乘

时间:2023-05-03 22:53:38 阅读:28399 作者:2021

我刚才注意到,我的脚本执行时间几乎减少了一半。 只是把乘法改为除法。 在

为了调查这个,我写了一个小例子。 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和{}以及{}{或}}和{}{或}}的完整说明。 另外,说明矢量化方法和迭代器的趋势也很有趣。 矢量化时,除法似乎很慢,迭代程序似乎很快。 在

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。