本系列文章由 @yhl_leo 出品,转载请注明出处。

文章链接: http://blog.csdn.net/yhl_leo/article/details/51793984


本文列举出几种python中常见的计算点积的方式,并统计随着向量维度的增大,各种方法的计算效率上的差异。

运行环境:

  • CPU:Intel® Core™ i7-5930K @ 3.50GHz
  • Python: 2.7.6

代码:

  1. from itertools import izip, starmap, imap
  2. import operator
  3. import numpy as np
  4. import time
  5. r = range(10000)
  6. # method 1
  7. np.dot(r,r)
  8. # method 2
  9. sum(starmap(operator.mul, izip(r,r)))
  10. # method 3
  11. out = 0
  12. for k in range(len(r)):
  13. out += r[k] * r[k]
  14. # method 4
  15. sum(map(operator.mul,r,r))
  16. # method 5
  17. sum(imap(operator.mul,r,r))
  18. # method 6
  19. sum(i*j for i, j in zip(r, r))

统计在不同向量维度:

  1. 10, 100, 1000, 2000, 3000, 4000, 5000, 8000, 10000

各运行三次:

  1. 10
  2. 1. 0.000285 0.000188 0.000309
  3. 2. 0.000117 6.3e-05 9.4e-05
  4. 3. 9.9e-05 6.1e-05 9.2e-05
  5. 4. 8.6e-05 4.4e-05 7.6e-05
  6. 5. 5.7e-05 4e-05 6.99999999999e-05
  7. 6. 9.3e-05 6e-05 8.29999999999e-05
  8. 100
  9. 1. 0.000513 0.00052 0.000504
  10. 2. 0.000169 0.000162 0.000167
  11. 3. 0.000451 0.000311 0.000288
  12. 4. 0.000137 0.000144 0.000153
  13. 5. 0.000131 0.000138 0.000141
  14. 6. 0.000224 0.000271 0.000216
  15. 1000
  16. 1. 0.001683 0.001687 0.001679
  17. 2. 0.000664 0.00065 0.000661
  18. 3. 0.002238 0.002301 0.002582
  19. 4. 0.000821 0.00089 0.00088
  20. 5. 0.000707 0.000928 0.000822
  21. 6. 0.001958 0.001948 0.00193
  22. 2000
  23. 1. 0.003138 0.00306 0.003158
  24. 2. 0.001197 0.001089 0.001075
  25. 3. 0.005211 0.004113 0.004399
  26. 4. 0.001891 0.001826 0.001953
  27. 5. 0.001415 0.001456 0.00173
  28. 6. 0.003595 0.003884 0.004285
  29. 3000
  30. 1. 0.004468 0.004292 0.004507
  31. 2. 0.001842 0.001727 0.001637
  32. 3. 0.007802 0.007341 0.006858
  33. 4. 0.002548 0.002274 0.0022
  34. 5. 0.002374 0.002348 0.002335
  35. 6. 0.005697 0.005613 0.005669
  36. 4000
  37. 1. 0.005946 0.005987 0.005954
  38. 2. 0.002251 0.002102 0.002189
  39. 3. 0.009069 0.010478 0.009226
  40. 4. 0.003149 0.003699 0.003363
  41. 5. 0.003032 0.003536 0.003142
  42. 6. 0.012805 0.012598 0.012316
  43. 5000
  44. 1. 0.007411 0.00731 0.007234
  45. 2. 0.002744 0.002508 0.002576
  46. 3. 0.012194 0.01231 0.009216
  47. 4. 0.003953 0.003815 0.003936
  48. 5. 0.00354 0.002698 0.002948
  49. 6. 0.013849 0.012262 0.015122
  50. 8000
  51. 1. 0.010604 0.011742 0.011604
  52. 2. 0.004712 0.004703 0.005037
  53. 3. 0.020271 0.014874 0.020436
  54. 4. 0.007199 0.006417 0.007193
  55. 5. 0.006887 0.006889 0.006892
  56. 6. 0.021665 0.021659 0.021992
  57. 10000
  58. 1. 0.01461 0.013028 0.014307
  59. 2. 0.005814 0.005789 0.005875
  60. 3. 0.023581 0.025064 0.025116
  61. 4. 0.008041 0.008833 0.008868
  62. 5. 0.007898 0.008619 0.008925
  63. 6. 0.025248 0.02643 0.026212

取运行时间的均值,绘制成曲线图,可以看出,几种方法里,第2种方法的复杂度最小,随着向量维度的增加,时间消耗增加比较缓慢,而其他方法则相对较大。

python 几种点积运算方式效率分析的更多相关文章

  1. 09 Python两种创建类的方式

    第一种比较普遍的方式: class Work(): def __init__(self,name): self.name = name w = Work('well woker') 这样就简单创建了一 ...

  2. 几种常见SQL分页方式效率比较(转)

    http://www.cnblogs.com/iamowen/archive/2011/11/03/2235068.html 分页很重要,面试会遇到.不妨再回顾总结一下. 1.创建测试环境,(插入10 ...

  3. 几种常见SQL分页方式效率比较

    分页很重要,面试会遇到.不妨再回顾总结一下: 一:创建测试环境,(插入100万条数据大概耗时5分钟). create database DBTestuse DBTest 二:--创建测试表 creat ...

  4. C++中三种传递参数方法的效率分析

    众所周知,在C++中有三种参数传递的方式: 按值传递(pass by value) #include <iostream> using namespace std; void swap(i ...

  5. 一个在字符串中查找多个关键字的函数strstrs(三种不同算法实现及效率分析)

    平时项目中有时需要用到在字符串中搜索两个或更多的关键字的情景.例如:将字符串"ab|cd#ef|"按竖线或者井号做分隔 如果是大项目,一般会采用正则表达式做处理.但有时写个小程序, ...

  6. python列表和字符串的三种逆序遍历方式

    python列表和字符串的三种逆序遍历方式 列表的逆序遍历 a = [1,3,6,8,9] print("通过下标逆序遍历1:") for i in a[::-1]: print( ...

  7. python下几种打开文件的方式

    昨天看完了这本python进阶,感觉这本书对我启发很大,做了三张纸的笔记,方便我在遇到问题的时候翻阅,然后寻找可能的解决方案.作为一个使用Python一年的小白,虽然说不是小白,但是这一年来基本上是用 ...

  8. Django,Flask,Tornado三大框架对比,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架

    Django 与 Tornado 各自的优缺点Django优点: 大和全(重量级框架)自带orm,template,view 需要的功能也可以去找第三方的app注重高效开发全自动化的管理后台(只需要使 ...

  9. Python 数据分析(二 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识

    Python 数据分析(二) 本实验将学习利用 Python 数据聚合与分组运算,时间序列,金融与经济数据应用等相关知识 第1节 groupby 技术 第2节 数据聚合 第3节 分组级运算和转换 第4 ...

随机推荐

  1. poj 3164 Command Network (朱刘算法)

    题目链接: http://poj.org/problem?id=3164 题目大意: 有n个点(用坐标表示)各点编号分别为1—>n,m条单向路,问能否存在一个花费价值最小的网络,能使从1点到达任 ...

  2. 题解报告:hdu 1124 Factorial(求N!尾数有多少个0。)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1124 Problem Description The most important part of a ...

  3. GUI初步和frame&panel

    java的话这个GUI其实不是什么重点,但我们也要学习,重点是学习这种图形编程的思路. java里面对于图形的一些类都封装在了AWT和它的一些子包里.AWT(抽象窗口开发包)            当 ...

  4. 5 月编程语言排行榜:Java第一,R跌出Top20

    我们都知道,最近,TIOBE 发布了 5 月份编程语言排行榜.其中,前三名依然健稳不变,他们分别是 Java.C.C++,第四则为: Python ,第五则为 VB .NET. 下面两张图,我们可以看 ...

  5. vscode显示php函数列表

    1.安装插件支持 https://marketplace.visualstudio.com/items?itemName=linyang95.php-symbols 2.ctrt+shift+o 即可 ...

  6. Java EE 目标

    在大三上学期学习了Java se,只是简单的学习了语法,而且没有及时的复习巩固,语法知识已经忘了许多.在这个新学期,又有了Java EE这门课,书上的内容是从没学习过的新知识,只是在网站上看到过像Sp ...

  7. leetcode_654. Maximum Binary Tree

    https://leetcode.com/problems/maximum-binary-tree/ 给定数组A,假设A[i]为数组最大值,创建根节点将其值赋为A[i],然后递归地用A[0,i-1]创 ...

  8. 移动端1px线适配问题-------适配各种编译CSS工具 stylus sass styled-componet实现方法

    其实在stylus与sass中实现移动端1像素线各个手机设备的适配问题的原理是一样的, 首先我还是先介绍一下原理和所依赖的方法 原理:其实他们都是通过css3的媒体查询来实现的 步骤思路: 1.给目标 ...

  9. 2. 区分散列的 undef 值, 和手动赋值 0 不一样。1. 使用exists函数,散列中有这个键(必须是keys %hash 有这结果),则返回真值,

    2. 123 my %vertical_alignment;    124 $vertical_alignment{"subscripting"} = 0;    125 unle ...

  10. print reverse <> 是打印全部的文件内容 ?

    reverse 是倒置 <> 则是 把 @ARGV  参数列表里面的文件都读取出来 ? print <> 就是和  cat 的功能一样了. 脚本语言交流.数据处理 QQ群:66 ...