我刚刚注意到,我的脚本的执行时间几乎减少了一半,只是将乘法更改为一个部门.

为了调查这个,我写了一个小例子:

import numpy as np

import timeit

# uint8 array

arr1 = np.random.randint(0, high=256, size=(100, 100), dtype=np.uint8)

# float32 array

arr2 = np.random.rand(100, 100).astype(np.float32)

arr2 *= 255.0

def arrmult(a):

"""

mult, read-write iterator

"""

b = a.copy()

for item in np.nditer(b, op_flags=["readwrite"]):

item[...] = (item + 5) * 0.5

def arrmult2(a):

"""

mult, index iterator

"""

b = a.copy()

for i, j in np.ndindex(b.shape):

b[i, j] = (b[i, j] + 5) * 0.5

def arrmult3(a):

"""

mult, vectorized

"""

b = a.copy()

b = (b + 5) * 0.5

def arrdiv(a):

"""

div, read-write iterator

"""

b = a.copy()

for item in np.nditer(b, op_flags=["readwrite"]):

item[...] = (item + 5) / 2

def arrdiv2(a):

"""

div, index iterator

"""

b = a.copy()

for i, j in np.ndindex(b.shape):

b[i, j] = (b[i, j] + 5) / 2

def arrdiv3(a):

"""

div, vectorized

"""

b = a.copy()

b = (b + 5) / 2

def print_time(name, t):

print("{: <10}: {: >6.4f}s".format(name, t))

timeit_iterations = 100

print("uint8 arrays")

print_time("arrmult", timeit.timeit("arrmult(arr1)", "from __main__ import arrmult, arr1", number=timeit_iterations))

print_time("arrmult2", timeit.timeit("arrmult2(arr1)", "from __main__ import arrmult2, arr1", number=timeit_iterations))

print_time("arrmult3", timeit.timeit("arrmult3(arr1)", "from __main__ import arrmult3, arr1", number=timeit_iterations))

print_time("arrdiv", timeit.timeit("arrdiv(arr1)", "from __main__ import arrdiv, arr1", number=timeit_iterations))

print_time("arrdiv2", timeit.timeit("arrdiv2(arr1)", "from __main__ import arrdiv2, arr1", number=timeit_iterations))

print_time("arrdiv3", timeit.timeit("arrdiv3(arr1)", "from __main__ import arrdiv3, arr1", number=timeit_iterations))

print("\nfloat32 arrays")

print_time("arrmult", timeit.timeit("arrmult(arr2)", "from __main__ import arrmult, arr2", number=timeit_iterations))

print_time("arrmult2", timeit.timeit("arrmult2(arr2)", "from __main__ import arrmult2, arr2", number=timeit_iterations))

print_time("arrmult3", timeit.timeit("arrmult3(arr2)", "from __main__ import arrmult3, arr2", number=timeit_iterations))

print_time("arrdiv", timeit.timeit("arrdiv(arr2)", "from __main__ import arrdiv, arr2", number=timeit_iterations))

print_time("arrdiv2", timeit.timeit("arrdiv2(arr2)", "from __main__ import arrdiv2, arr2", number=timeit_iterations))

print_time("arrdiv3", timeit.timeit("arrdiv3(arr2)", "from __main__ import arrdiv3, arr2", number=timeit_iterations))

这将打印以下时间:

uint8 arrays

arrmult : 2.2004s

arrmult2 : 3.0589s

arrmult3 : 0.0014s

arrdiv : 1.1540s

arrdiv2 : 2.0780s

arrdiv3 : 0.0027s

float32 arrays

arrmult : 1.2708s

arrmult2 : 2.4120s

arrmult3 : 0.0009s

arrdiv : 1.5771s

arrdiv2 : 2.3843s

arrdiv3 : 0.0009s

我一直认为乘法在计算上比分部便宜.然而,对于uint8,一个部门似乎几乎是有效的两倍.这是否与事实有关,* 0.5必须计算浮点数中的乘法,然后将结果转换为整数?

至少对于浮标,乘法似乎比分裂更快.这一般是正确的吗?

为什么uint8中的乘法比float32中的乘法更多?我认为一个8位无符号整数应该比32位浮点计算快得多吗?

有人可以“神秘化”吗?

编辑:有更多的数据,我已经包括向量化函数(如建议)和添加的索引迭代器.矢量化的功能要快得多,因此并不是真正的可比性.然而,如果向量化函数的timeit_iterations设置得高得多,则结果是uint8和float32的乘法更快.我想这更混淆了吗?

实际上,乘法总是比划分更快,但是for循环中的主要性能泄漏不是算术运算,而是循环本身.尽管这不能解释为什么循环对于不同的操作有不同的表现.

EDIT2:像@jotasi已经说过,我们正在寻找一个完整的分解与乘法和int(或uint8)与float(或float32)的解释.另外,解释向量化方法和迭代器的不同趋势将是有趣的,如在矢量化的情况下,分割似乎更慢,而在迭代器情况下更快.

python中乘法和除法_python – NumPy的性能:uint8对比浮动和乘法与除法?相关推荐

  1. python中tan怎么表示_Python numpy.tan()用法及代码示例

    numpy.tan(array [,out])= ufunc'tan'):此数学函数可帮助用户计算所有x(作为数组元素)的三角切线. 参数: array :[array_like]elements a ...

  2. python中cos怎么表示_Python numpy.cos()用法及代码示例

    numpy.cos(x [,out])= ufunc'cos'):此数学函数可帮助用户计算所有x(作为数组元素)的三角余弦. 参数: array :[array_like]elements are i ...

  3. python中while的用法_Python—while循环,内涵五种九九乘法表

    while语句 while循环是一个条件循环语句,如果while后的条件为真时,代码块一直循环,直到条件不再为真则结束循环. while循环的语法如下: while expression: suite ...

  4. python中的f函数_Python/numpy/pandas中函数f(x,y)结果的矩阵

    我有两个系列X和Y,在Python中有一个函数f(X,Y).我想生成一个矩阵,其中包含X和Y的每个组合的函数的输出.例如,如果函数只是一个简单的乘法,它将如下所示:1 2 3 4 5 -------- ...

  5. python中的insert函数_Python numpy.insert函数方法的使用

    numpy.insert numpy.insert(arr, obj, values, axis=None) [source] 沿给定轴在给定索引之前插入值.参数 :arr :array_like 输 ...

  6. python中sinh是什么_Python numpy.sinh()用法及代碼示例

    numpy.sinh(x [,out])= ufunc'sin'):此數學函數可幫助用戶計算所有x(作為數組元素)的雙曲正弦值. 等效於1/2 *(np.exp(x)-np.exp(-x))或-1j ...

  7. python中满足条件相加_python – Numpy:条件求和

    我有以下numpy数组: import numpy as np arr = np.array([[1,2,3,4,2000], [5,6,7,8,2000], [9,0,1,2,2001], [3,4 ...

  8. python中tile的用法_Python numpy.tile函数方法的使用

    numpy.tile numpy.tile(A, reps)      [source] 通过重复A代表次数来构造数组. 如果代表的长度为d,则结果的尺寸为max(d,A.ndim). 如果A.ndi ...

  9. python 向量_关于Python中的向量相加和numpy中的向量相加效率对比

    直接使用Python来实现向量的相加 # -*-coding:utf-8-*- #向量相加 def pythonsum(n): a = range(n) b = range(n) c = [] for ...

最新文章

  1. 好莱坞科幻新片《b》,钦定 AI 机器人出演女主角!
  2. 特征工程(feature engineering)是什么?特征工程(feature engineering)包含哪些方面?
  3. linux mount 内核镜像,在Linux live system中创建loop设备并挂载镜像文件
  4. 嵌入式ARM启动代码的工作
  5. 阿里云HBase全新发布X-Pack NoSQL数据库再上新台阶 1
  6. LeetCode 2018. 判断单词是否能放入填字游戏内(模拟)
  7. 想要入坑机器学习?这是MIT在读博士的AI心得
  8. php bloginfo templatedirectory,PHP变量不显示使用bloginfo('template_directory')的图像
  9. azure api 管理_通过成本管理跟踪Azure成本
  10. 解压版mysql中文变成_解压版MYSQL中文乱码问题解决方案
  11. Java服务器多站点,java客户端web服务器连接到多个web服务器
  12. 【树莓派搭建个人网站】花生壳内网穿透
  13. VMware Vsphere 6.0安装部署 总体部署架构
  14. 员工收“老板”QQ消息转账98万 警方挽回被骗资金
  15. 修改chrome中HTML元素,自由更改网页中的任何内容:Hack this page
  16. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_17_注解_解析注解...
  17. WES 7 FBWF灾难性故障
  18. STM32F429 之EXTI外部中断
  19. journalctl命令详解
  20. 虚拟局域网服务器群晖,基于虚拟机的黑群晖NAS+基于虚拟局域网的远程访问

热门文章

  1. 【线上分享】短视频出海 — 用户体验衡量关键指标与优化策略
  2. 音视频技术开发周刊 86期
  3. 微信小程序开放直播能力,你怎么看?
  4. 一个运维老将的自我修养
  5. 实践篇 | 推荐系统之矩阵分解模型
  6. python flask
  7. WebRTC编译系统之GYP,gn和ninja
  8. 多窗口管理器Tmux - 从入门到精通
  9. 通俗理解Paxos算法
  10. lua实现多继承-方式2