在算法课程中,我们往往使用时间复杂度(大 O 符号)作为衡量算法性能的重要指标。这种表示方法对于算法理论性能分析非常有效,但也可能给我们带来一种误解,即常数项的时间复杂度变化对实际的数值计算效率影响不大。事实上,在实际的数值计算中,有以下关于计算性能的重要事实。尽管它们带来的都是常数级的时间复杂度变化,但对计算性能的影响却相当显著。

  • 不同的程序设计语言由于设计机制和理念,以及编译器 / 解释器的实现方式不同,在数值计算的效率上有着巨大的区别。例如,Python 语言为了增强语言的动态性,而牺牲了大量计算效率。而 C/C++ 语言虽然复杂,但具有出色的计算效率。简而言之,对程序员友好的语言往往对计算机不友好,反之亦然。不同程序设计语言带来的性能差距可达 数量级以上。TensorFlow 等各种数值计算库的底层就是使用 C++ 开发的;
  • 对于矩阵运算,由于有内置的并行加速和硬件优化过程,数值计算库的内置方法(底层调用 BLAS)往往要远快于直接使用 For 循环,大规模计算下的性能差距可达 数量级以上;
  • 对于矩阵 / 张量运算,GPU 的并行架构(大量小的计算单元并行运算)使其相较于 CPU 具有明显优势,具体视 CPU 和 GPU 的性能而定。在 CPU 和 GPU 级别相当时,大规模张量计算的性能差距一般可达 以上。

以下示例程序使用了 Python 的三重 For 循环、Cython 的三重 For 循环、NumPy 的 dot 函数和 TensorFlow 的 matmul 函数,分别计算了两个 10000×10000 的随机矩阵 A 和 B 的乘积。程序运行平台为一台具备 Intel i9-9900K 处理器、NVIDIA GeForce RTX 2060 SUPER 显卡与 64GB 内存的个人电脑(后文亦同)。运行所需时间分别标注在了程序的注释中。

import tensorflow as tf
import numpy as np
import time
import pyximport; pyximport.install()
import matrix_cythonA = np.random.uniform(size=(10000, 10000))
B = np.random.uniform(size=(10000, 10000))start_time = time.time()
C = np.zeros(shape=(10000, 10000))
for i in range(10000):for j in range(10000):for k in range(10000):C[i, j] += A[i, k] * B[k, j]
print('time consumed by Python for loop:', time.time() - start_time)    # ~700000sstart_time = time.time()
C = matrix_cython.matmul(A, B)      # Cython 代码为上述 Python 代码的 C 语言版本,此处省略
print('time consumed by Cython for loop:', time.time() - start_time)    # ~8400sstart_time = time.time()
C = np.dot(A, B)
print('time consumed by np.dot:', time.time() - start_time)     # 5.61sA = tf.constant(A)
B = tf.constant(B)
start_time = time.time()
C = tf.matmul(A, B)
print('time consumed by tf.matmul:', time.time() - start_time)  # 0.77s

可见,同样是 O(n^3) 时间复杂度的矩阵乘法(具体而言10^2次浮点数乘法的计算量),使用 GPU 加速的 TensorFlow 竟然比直接使用原生 Python 循环快了近 100 万倍!这种极大幅度的优化来源于两个方面,一是使用更为高效的底层计算操作,避免了原生 Python 语言解释器的各种冗余检查等所带来的性能损失(例如,Python 中每从数组中取一次数都需要检查一次是否下标越界)。二是利用了矩阵相乘运算具有的充分的可并行性。在矩阵相乘 A * B 的计算中,矩阵 A 的每一行与矩阵 B 的每一列所进行的相乘操作都是可以同时进行的,而没有任何的依赖关系。

关于计算性能的若干重要事实相关推荐

  1. 关于Richard Stallman的若干惊人事实

    转自:http://www.soimort.org/tech-blog/2012/07/19/rms-facts.html 下面所有的事情以及评论都来自原文,不出自我之口... 今天在GNU Octa ...

  2. 诺亚面向语音语义的深度学习研究进展

    本文来自华为诺亚方舟实验室资深专家刘晓华在携程技术中心主办的深度学习Meetup中的主题演讲,介绍了华为诺亚面向语音语义的深度学习进展. 本次演讲简要回顾了深度学习近十年进展,重点介绍华为诺亚方舟实验 ...

  3. Sigmoid函数与逻辑回归

    文章目录 (1). Sigmoid函数的由来--伯努利分布的衍生物 1.1 为什么会有 sigmoid 函数的出现? 1.2 sigmoid 函数推导过程 1.3 sigmoid 函数求导 (2). ...

  4. 深度学习技术在机器阅读理解应用的研究进展

    深度学习解决机器阅读理解任务的研究进展:https://blog.csdn.net/malefactor/article/details/52832134 深度学习技术在机器阅读理解应用的研究进展:h ...

  5. 深度学习要多深_才能读懂人话?

    原文链接 研究背景 阿里小蜜是阿里巴巴推出的围绕电商服务.导购以及任务助理为核心的智能人机交互产品,在去年双十一期间,阿里小蜜整体智能服务量达到643万,其中智能解决率达到95%,成为了双十一期间服务 ...

  6. 深度学习解决机器阅读理解任务的研究进展

    /*版权声明:可以任意转载,转载时请标明文章原始出处和作者信息.*/ author: 张俊林 关于阅读理解,相信大家都不陌生,我们接受的传统语文教育中阅读理解是非常常规的考试内容,一般形式就是给你一篇 ...

  7. 尺规虽设,犹奈“度”何

    尺规虽设,犹奈"度"何 常言道:不以规矩,不能成方圆.用尺(矩)画方形,用规画圆形,尺上的刻度量出方形的边长,规上的跨度扫出圆形的面积,那么,尺规上的刻度决定了所能作出的方圆的精度 ...

  8. mondrian的个人总结

    1. OLAP的作用和功能 OLAP(On-Line Analysis Processing)在线分析处理是一种共享多维信息的快速分析技术:OLAP利用多维数据库技术使用户从不同角度观察数据,它用于支 ...

  9. 深入对比数据仓库模式:Kimball vs Inmon

    1.概述     Kimball和Inmon是两种主流的数据仓库方法论,分别由 Ralph Kimbal大神 和 Bill Inmon大神提出,在实际数据仓库建设中,业界往往会相互借鉴使用两种开发模式 ...

最新文章

  1. 2059-authentication plugin 'caching_sha2_passwordcnnot bt loaded :mysql8.0数据库链接不上:
  2. BZOJ3172 [Tjoi2013]单词 字符串 SA ST表
  3. android setting模块,android O版本 设置(Settings)模块总结--设置的一级界面的加载
  4. Lua和C++交互总结(很详细)
  5. myeclipse在weblogic中的开发
  6. layui 表格新增删除一行
  7. 刚在虚拟机上装的Linux系统,ifconfig后IP地址怎么成了127.0.0.1了
  8. mysql的基本介绍简书_mysql 简介
  9. CV之IC:计算机视觉之图像分类(Image Classification)方向的简介、使用方法、案例应用之详细攻略
  10. 搜索引擎设计实用教程(2)-以百度为例
  11. scala中使用特质中的抽象字段和实际字段
  12. linux添加文件后无法启动,linux安装后grub无法启动
  13. 创业者如何更好地认知世界?
  14. GEF入门实例_总结_04_Eclipse插件启动流程分析
  15. troublemaker中文谐音_求Arashi 岚的Troublemaker的中文谐音~~~~ 超感激~
  16. C语言小算法:ACSII码(多字节)和Unicode(宽字节)互转
  17. WAPI安全协议检测系统测试分析
  18. 常见文件扩展名和它们的说明(转)
  19. 收藏的一些前端酷炫网站
  20. Android开发经验、能力提升

热门文章

  1. C语言-main函数的参数
  2. Java运行时数据区及对象的分配
  3. javaweb(10) cookiesession
  4. 2.15_graph_图
  5. python web框架 多线程和多进程_python的多线程和多进程(一)
  6. master节点重置后添加node报错_超强教程!在树莓派上构建多节点K8S集群!
  7. java.exe闪退_java 双击jar包闪退或没反应,使用cmd运行提示没有主清单属性,该如何解决...
  8. 改错字符串正序反序c语言,C语言程序改错题
  9. 8——对象的作用域,生存期,……
  10. Codevs 3342 绿色通道