使用正确的范式和高性能的库来给python加速
 

使用6种不同的方法,在1000000个元素的列表上进行,一个数值运算:
公式:

       f(x)=|cos(x∗2)|‾‾‾‾‾‾‾‾‾‾√+sin(2+2∗x) f(x) = \sqrt{|cos(x *2 )|} + sin( 2 + 2 *x)

1.包含显式循环的标准python实现
2.列表解析取代显式循环
3.列表解析+eval()
4.Numpy向量化实现
5.numexpr单线程实现+向量化
6.numexpr多线程实现+向量化

from timeit import repeat
import math as mt
import numpy as np
import numexpr as ne
# 定义一个比较不同函数的数值计算性能的方法
# 参数:
# func_list : 函数名列表
# data : 列表
# rep : 函数测试次数
# number : 每次测试每个函数执行的次数
def perf_compare(func_list, data, rep = 3, number = 1):res_list = {}for func_name in func_list:stmt = func_name + '(' + str(data) + ')'       # example : func_1(data),测试的函数 setup = 'from __main__ import ' + func_name     # 构建环境倒入语句results = repeat(stmt= stmt, setup= setup, repeat= rep, number=number)res_list[func_name] = sum(results)/repres_sort = sorted(res_list.iteritems(),key=lambda(k,v):(v,k))  # 根据字典的value,进行排序for item in res_sort:rel = item[1] /res_sort[0][1]  # 每一个函数的测试结果与第一名对比print 'function :'+ item[0] +' time sec :%.5f'%item[1] + ' relative: %.6f'%rel
# 计算公式转换为一个python函数
def f(x):return abs(mt.cos(2 * x)) ** 0.5 + mt.sin(2 + 2 * x)
# function 1
def f1(data):res = []for x in data:res.append(f(x))return res 
# function 2
def f2(data):return [f(x) for x in data]
# function 3
def f3(data):ex = 'abs(mt.cos(2 * x))** 0.5 + mt.sin(2 + 2 * x)'return [eval(ex) for x in data]
# function 4
def f4(data):array = np.array(data)return np.abs(np.cos(2 * array)) ** 0.5 + np.sin(2 + 2 * array)
# function 5
def f5(data):array = np.array(data)ex = 'abs(cos(2 * array))** 0.5 + sin(2 + 2 * array)'ne.set_num_threads(1)return ne.evaluate(ex)
# function 6
def f6(data):array = np.array(data)ex = 'abs(cos(2 * array))** 0.5 + sin(2 + 2 * array)'ne.set_num_threads(16)return ne.evaluate(ex)
# 数据
data = range(1000000)
%%time
f1(data)
f2(data)
f3(data)
f4(data)
f5(data)
f6(data)
CPU times: user 27.3 s, sys: 132 ms, total: 27.5 s
Wall time: 27.2 s
# 检查两个结果是否相同
np.allclose(f5(data),f6(data))
True
# 接下来对各个函数的计算速度进行对比
func_list = ['f1','f2','f3','f4','f5','f6']
perf_compare(func_list, data)
function :f6 time sec :0.09421 relative: 1.000000
function :f5 time sec :0.11507 relative: 1.221374
function :f4 time sec :0.15990 relative: 1.697231
function :f2 time sec :0.83077 relative: 8.818185
function :f1 time sec :0.93550 relative: 9.929849
function :f3 time sec :24.41118 relative: 259.111542

 
结果很明显,使用多线程加速的f6最快,对100万个数据进行计算耗时最短,Numpy实现的f4比f5稍微慢了一点.列表解析比for循环快了一点,f3最慢,在求值运算当中eval()会造成巨大负担.基于字符串的表达式在一次编译后被重复执行100万次
 

Python性能加速相关推荐

  1. python 优化加速方案

    也看了知乎上关于python加速方案,有好多方案,但是感觉没全记住,这里把自己需要总结的记下来, 原文:https://www.zhihu.com/question/24695645?sort=cre ...

  2. python3 性能提升_整理下Python性能语法,非常有效的提高性能的tips

    阅读 Zen of Python,在Python解析器中输入 import this. 一个犀利的Python新手可能会注意到"解析"一词, 认为Python不过是另一门脚本语言. ...

  3. just函数python_提升 Python 性能 Numba 与 Cython

    ? "Python猫" ,一个值得加星标的公众号花下猫语:最近,读者微信群里又频繁聊到了 Python 的性能问题,这真是老生常谈了.我想起自己曾收藏过几篇关于如何提升性能的文章, ...

  4. python 代码_如何让Python代码加速运行?

    Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足.但是,有很多时候,Python 的效率并没有想象中的那么夸张.本文对一些 Python 代码加速运行的技巧 ...

  5. 人生苦短,喝点python性能鸡汤

     在Python解析器中输入 import this. 一个犀利的Python新手可能会注意到"解析"一词, 认为Python不过是另一门脚本语言,"它肯定很慢!&q ...

  6. Python性能优化

    http://blog.csdn.net/pipisorry/article/details/39998317 python 作为脚本的一个不足之处,那就是执行效率和性能不够理想,特别是在 perfo ...

  7. 【python】Python性能鸡汤

    阅读  Zen of Python ,在Python解析器中输入  import this . 一个犀利的Python新手可能会注意到"解析"一词, 认为Python不过是另一门脚 ...

  8. 1.python性能优化

    Python性能优化--1 1.去掉不必要的显式for,改为向量化计算(numpy) 2.使用numba加速 3.使用多进程(开核) 4.使用sklearn.extenals.joblib扩展库 5. ...

  9. 如何让Python代码加速运行?

    Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足.但是,有很多时候,Python 的效率并没有想象中的那么夸张.本文对一些 Python 代码加速运行的技巧 ...

  10. Python性能优化指南--让你的Python代码快x3倍的秘诀

    Python性能优化指南 Python最为人诟病的就是其执行速度.如何让Python程序跑得更快一直是Python核心团队和社区努力的方向.作为Python开发者,我们同样可以采用某些原则和技巧,写出 ...

最新文章

  1. python计算出nan_python如何进行汇总统计?
  2. 提取图片名称 c 语言,【图片】给词法元素分析提取的程序跪了【c语言吧】_百度贴吧...
  3. ubuntu安装office2010方法如下:
  4. C#获取本机名及IP地址
  5. python语言输入两个数_python的函数输入两个参数吗
  6. C#中释放数据库连接资源
  7. 什么是浏览器同源策略?
  8. php算法求出一个数可以被分解成多少个_最全的小学干货:34个数学重难点公式(三)...
  9. 动物之美计算机教案,清华大学版六年级上册信息技术教案第三课 动物之美——图像分类管理.pdf...
  10. 使用“Apple 诊断”来测试您的Mac 是不是存在硬件问题
  11. 最近华为笔试题(9.8)第三题
  12. mybatis从0到1--学mybatis看这一篇就足够
  13. steamcommunity 302占用端口
  14. 【BZOJ4200】【UOJ132】【NOI2015】小园丁与老司机
  15. 臭名昭著的Java”
  16. 建兴固态硬盘垃圾/LITEON SSD SUCKS
  17. 【计科快速入门】五、算术逻辑单元
  18. 小试爬虫之豆瓣电影TOP250
  19. mysql 中的select,from,where,group by等 关键字 执行顺序与别名问题
  20. 苹果七绕过基带激活2020_【快讯:苹果135亿的基带订单,高通疑有诈直接拒绝了;网传索尼移动考虑退出东南亚手机市场;黑客成功获取iPhone XS 权限】...

热门文章

  1. ffplay拿不到rtp流_苇名城都亡了,还跟我讲科学?- 苇名无心流秘籍解析
  2. java nmap集成_nmap为了开发方便 可以做简单的修改
  3. Windows下 Nginx创建文件服务器
  4. 【转】Nodejs链接Mysql批量添加 insert into
  5. 你对Redis持久化了解多少?一篇文章让你明白Redis持久化
  6. Go语言编程(七牛云存储团队执笔)
  7. 国产操作系统思普将起诉微软涉嫌“商业诋毁”
  8. 周鸿祎的“流氓”可否借鉴?
  9. mysql定位数据库_MySQL数据库Query性能定位
  10. hdu 1873“看病要排队”——优先队列的应用